2014-10-29 1 views
0

Я пытаюсь реализовать GLM-проект и функции unproject в Lua, но результаты ... сомнительны. Насколько я могу судить, мой код (показан ниже) почти идентичен GLM, но, как видно из приведенного ниже видео, текст не отображается так, как предполагалось. Когда я приношу фотоаппарат к 0,0,0, текст формирует алмазный узор, что интересно.mat4 project/unproject не работает

Здесь должны отображаться слова cube.001 через cube.009, которые должны быть нарисованы поверх их соответствующих кубов независимо от того, куда движется камера. cube.001 - TL, куб.009 - BR.

Для полного изучения нашей библиотеки mat4 (и других барахлов) посетите here.

-- https://github.com/g-truc/glm/blob/master/glm/gtc/matrix_transform.inl#L317 
function mat4.project(obj, view, projection, viewport) 
    local position = { obj.x, obj.y, obj.z, 1 } 
    position = view * position 
    position = projection * position 

    position[1] = position[1]/position[4] * 0.5 + 0.5 
    position[2] = position[2]/position[4] * 0.5 + 0.5 
    position[3] = position[3]/position[4] * 0.5 + 0.5 
    position[4] = position[4]/position[4] * 0.5 + 0.5 

    position[1] = position[1] * viewport[3] + viewport[1] 
    position[2] = position[2] * viewport[4] + viewport[2] 

    return vec3(position[1], position[2], position[3]) 
end 

-- https://github.com/g-truc/glm/blob/master/glm/gtc/matrix_transform.inl#L338 
function mat4.unproject(win, view, projection, viewport) 
    local inverse = (projection * view):inverse() 
    local position = { win.x, win.y, win.z, 1 } 
    position.x = (position.x - viewport[1])/viewport[3] 
    position.y = (position.y - viewport[2])/viewport[4] 

    position[1] = position[1] * 2 - 1 
    position[2] = position[2] * 2 - 1 
    position[3] = position[3] * 2 - 1 
    position[4] = position[4] * 2 - 1 

    position = inverse * position 

    position[1] = position[1]/position[4] 
    position[2] = position[2]/position[4] 
    position[3] = position[3]/position[4] 
    position[4] = position[4]/position[4] 

    return vec3(position[1], position[2], position[3]) 
end 

-- Get projection from cubes 
local viewport = { 0, 0, 1280, 720 } 
for _, cube in ipairs(self.cubes) do 
    local model = cpml.mat4() 
     :translate(cube.position) 
     :rotate(cube.orientation.x, { 1, 0, 0 }) 
     :rotate(cube.orientation.y, { 0, 1, 0 }) 
     :rotate(cube.orientation.z, { 0, 0, 1 }) 
     :scale(cube.scale) 

    local projection = cpml.mat4.project(
     cube.position, 
     self.camera.view:transpose(), 
     self.camera.projection:transpose(), 
     viewport 
    ) 
end 
+0

in unproject Я вижу, что position.x присваивается дважды, а не y во второй раз. –

+0

Благодарим вас за то, что я сейчас пойду и изменю. Мы еще не тестировали unproject, поскольку проект вызывает у нас столько проблем. :) – Karai17

ответ

0

Оказывается, две вещи, которые были неправильно:

1) матрицы должны быть перенесены, так как у меня есть ошибка ... где-то в моем коде.

2) GLM использует слово «модель» при обращении к камере, поэтому я все время использовал неправильную матрицу.

Я обновил код, чтобы отразить эти исправления.