【发布时间】:2014-12-24 14:26:52
【问题描述】:
我正在尝试在 Lua 中实现 GLM 的项目和取消项目功能,但结果......值得怀疑。据我所知,我的代码(如下所示)与 GLM 几乎相同,但正如下面的视频所示,文本未按预期显示。当我将相机带到0,0,0时,文字形成菱形图案,这很有趣。
这里应该显示的是单词 cube.001 到 cube.009 应该被绘制在它们各自的立方体上,不管相机移动到哪里。 cube.001 是 TL,cube.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
【问题讨论】:
-
在 unproject 我看到 position.x 被分配了两次,而不是第二次被分配给 y。
-
感谢您发现这一点,我现在就去更改它。我们还没有真正测试过 unproject,因为项目给我们带来了很多问题。 :)
标签: opengl math lua projection glm-math