0

我已经沉没了几天的试验和谷歌搜索,试图解决这个问题,我要么太厚以至于无法理解我被告知的内容,要么没有搜索正确的术语。

我有一个系统设置,可以将一个对象渲染到 3D 空间中,并且还有一个“相机”的实现。我现在正在尝试添加一个光源并且遇到了一个非常令人沮丧的问题。

“相机”实际上是在渲染任何特定项目之前应用的 mvMatrix 的旋转和平移。

如果我向我的对象添加逻辑,让它在自己的轴上旋转,那么灯光会正确地保持不动,并在对象面对光源时照亮对象上的各个面。但是,如果我移动相机,光源相对于相机“粘”,这不是我想要的。

解决此问题的一些尝试是:

  • 在移动和旋转相机之前定位灯光,
  • 移动和旋转相机后定位灯光,
  • 在移动后和旋转相机之前定位灯光,
  • 在渲染完所有内容并弹出 mvMatrix 后定位灯光,
  • 在渲染完所有内容之后和弹出 mvMatrix 之前定位灯光,
  • 在程序开始时将灯光定位一次,而不是在渲染循环期间再次定位,
  • 定位灯光时,将其位置 vec3 乘以 mvMatrix(这让我非常接近,但似乎并不总是将灯光定位在 0,0,0)
  • 定位灯光时,将其位置 vec3 乘以 mvMatrix 的倒数(非常奇怪的结果)。

这让我相信我需要通过 mvMatrix 旋转来旋转,但忽略它的翻译(我不知道为什么,我想这是我唯一能想到的我没有尝试过的东西),但我可能错了我还没有找到一个简单的方法来做到这一点。

无论如何,我确定你想看代码,我在一个公共 github 存储库中都有它(欢迎 PR,哈!),以下是我希望你会感兴趣的部分:

我知道prepareLighting 已经很黑了,我只想先了解它,然后再制作一个Light 对象。

如果您想看到它的实际效果,请看这里: http ://www.bracketbrotherhood.com/webgl-engine

我真的很感激这方面的一些帮助,因为我真的很困惑。

顺便说一句,这是我第一次尝试整洁有序的 JS,所以如果您对如何更好地组织代码库有任何意见,我也很乐意听到,尽管我应该强调这绝对是一个较低的关注点我,现在,而不是解决我的照明问题!

对不起,文字墙...非常感谢!

菲尔,

4

1 回答 1

0

我从以下位置复制了照明代码:http: //learningwebgl.com/lessons/lesson07/index.html

这里的照明代码调用了 vec3.normalize,尽管我不是 100% 确定这是在做什么(我猜它正在把它变成正常的......)删除它解决了这个问题 :)

为了清楚起见,这是我的前后:

var alp = vec3.create();
vec3.normalize([17,0,0], alp);

将其更改为:

var alp = vec3.create([17,0,0]);

修复了问题,万岁!

于 2013-08-17T09:05:07.330 回答