【发布时间】:2013-08-17 07:44:45
【问题描述】:
为了解决这个问题,我进行了几天的试验和谷歌搜索,但我要么太笨,无法理解我被告知的内容,要么没有在谷歌上搜索正确的术语。
我有一个系统设置,可以将一个对象渲染到 3D 空间中,并且还有一个“相机”的实现。我现在正在尝试添加一个光源,但遇到了一个非常令人沮丧的问题。
“相机”实际上是在渲染任何特定项目之前应用的 mvMatrix 的旋转和平移。
如果我向我的对象添加逻辑,让它在自己的轴上旋转,那么灯光会正确地保持不动,并在对象面对光源时照亮对象上的各个面。但是,如果我移动相机,光源会相对于相机“粘”,这不是我想要的。
解决此问题的一些尝试是:
- 在移动和旋转相机之前定位灯光,
- 移动和旋转相机后定位灯光,
- 在移动相机之后和旋转相机之前定位灯光,
- 在渲染完所有内容并弹出 mvMatrix 后定位灯光,
- 在渲染完所有内容之后、弹出 mvMatrix 之前定位灯光,
- 在程序开始时定位灯光一次,而不是在渲染循环期间再次定位,
- 定位灯光时,将其位置 vec3 乘以 mvMatrix(这让我非常接近,但似乎并不总是将灯光定位在 0,0,0)
- 定位光源时,将其位置 vec3 乘以 mvMatrix 的倒数(非常奇怪的结果)。
这让我相信我需要通过 mvMatrix 旋转来旋转,但忽略它的翻译(我不知道为什么,我想这是我唯一能想到的我没有尝试过的东西),但我可以错了,因为我找不到简单的方法来做到这一点。
无论如何,我确定你想看代码,我在公共 github 存储库中提供了所有代码(欢迎 PR,哈!),以下是我希望你会感兴趣的部分:
- 主渲染循环:https://github.com/philbrookes/webgl-engine/blob/add-normals-and-lighting/webgl-engine/Renderer.js#L37
- 相机的位置和旋转方法:
- prepareLighting 方法:https://github.com/philbrookes/webgl-engine/blob/add-normals-and-lighting/webgl-engine/Renderer.js#L73
我知道prepareLighting 已经被破解了,我只是想先了解它,然后再制作一个Light 对象。
如果您想看到它的实际效果,请看这里: http://www.bracketbrotherhood.com/webgl-engine
我非常感谢您对此的帮助,因为我真的很困惑。
顺便说一句,这是我第一次尝试整洁有序的 JS,所以如果你有任何关于如何更好地组织代码库的问题,我也很想听听,尽管我应该强调这绝对是一个比起解决我的照明问题,我现在更关心的是!
对不起,文字墙...非常感谢!
菲尔,
【问题讨论】:
-
我应该注意到,我也将其作为 opengl 问题进行了谷歌搜索,并且大多数解决方案都涉及使用 glLight,我在 webgl 中找不到相关调用。
-
我已将我的对象移动到 0、-5、0 并重新应用 mvMatrix 的乘法,当我的光线处于 0,0,0 时,这非常有效。当沿着任何轴正向移动灯光时,它会稍微工作(就像它在该轴上移动到 1,即灯光位置:[0,5,0] 似乎将其设置为 [0,1,0]),但是负轴值似乎被忽略了!
标签: javascript camera webgl lighting