Javascript 矩阵旋转对光源的影响

Javascript 矩阵旋转对光源的影响,javascript,camera,webgl,lighting,Javascript,Camera,Webgl,Lighting,为了解决这个问题,我花了好几天的时间进行实验和谷歌搜索,我要么太笨了,无法理解别人告诉我的内容,要么没有用谷歌搜索正确的术语 我设置了一个系统,可以将一个对象渲染到3D空间,还实现了一个“摄像头”。我现在正试图添加一个光源,遇到了一个相当令人沮丧的问题 “摄影机”实际上是在渲染任何特定项目之前应用的mvMatrix的旋转和平移 如果我向对象添加逻辑,使其在自己的轴上旋转,灯光将正确地保持不变,并在面向光源时照亮对象上的各个面。但是,如果我移动相机,光源相对于相机“粘住”,这不是我想要的 解决这一

为了解决这个问题,我花了好几天的时间进行实验和谷歌搜索,我要么太笨了,无法理解别人告诉我的内容,要么没有用谷歌搜索正确的术语

我设置了一个系统,可以将一个对象渲染到3D空间,还实现了一个“摄像头”。我现在正试图添加一个光源,遇到了一个相当令人沮丧的问题

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

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

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

  • 在移动和旋转摄像机之前,请将灯放置好
  • 移动和旋转相机后放置灯光
  • 在移动摄像机后和旋转摄像机前,定位灯
  • 渲染完所有内容并弹出mvMatrix后,定位灯光
  • 渲染完所有内容后,在弹出mvMatrix之前定位灯光
  • 在程序开始时放置灯光一次,而不是在渲染循环期间再次放置灯光
  • 当定位灯光时,将其位置vec3乘以mvMatrix(这使我非常接近,但似乎并不总是将灯光定位在0,0,0)
  • 当定位灯光时,将其位置vec3乘以mvMatrix的倒数(非常奇怪的结果)
这让我相信我需要通过mvMatrix旋转来旋转,但忽略它的平移(我不知道为什么,我想这是我唯一能想到的我没有尝试过的事情),但我可能是错的,因为我没有找到一个简单的方法来做到这一点

无论如何,我肯定你想看看代码,我在一个公共github repo(PRs欢迎,哈!)中都有这些代码,以下是我希望你会感兴趣的部分:

  • 主渲染循环:
  • 相机的位置和旋转方法:
  • 准备照明方法:
我知道prepareLighting是一个非常复杂的概念,我只是想先了解它,然后再制作一个轻的对象

如果你想看到它的实际应用,请看这里:

我真的很感激你能给我一些帮助,因为我真的被卡住了

顺便说一句,这是我第一次尝试使用整洁有序的JS,所以如果你对我如何更好地组织代码库有任何意见,我也很乐意听到,尽管我应该强调,现在对我来说,这肯定比解决我的照明问题要低

对不起,这是文字墙。。。非常感谢你


菲尔,

我从以下地方复制了照明代码:

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

为清楚起见,以下是我的“之前”和“之后”:

var alp = vec3.create();
vec3.normalize([17,0,0], alp);
将此更改为:

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

解决了这个问题,万岁

我应该注意的是,我也在谷歌上搜索了opengl问题,大多数解决方案都涉及使用glLight,而我在webgl中找不到相关的调用。我已经将我的对象移动到0,-5,0,并重新应用了mvMatrix的乘法,当我的灯光为0,0,0时,效果非常好。当沿着任何轴正向移动灯光时,它会稍微工作(就像它在该轴上移动到1,即灯光位置:[0,5,0]似乎会将其设置为[0,1,0]),但是负轴值似乎会被忽略!如果你想看,我已经更新了:)