【问题标题】:matrix rotation effecting light source矩阵旋转效应光源
【发布时间】:2013-08-17 07:44:45
【问题描述】:

为了解决这个问题,我进行了几天的试验和谷歌搜索,但我要么太笨,无法理解我被告知的内容,要么没有在谷歌上搜索正确的术语。

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

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

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

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

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

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

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

我知道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


【解决方案1】:

我从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]);

已解决问题,万岁!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-02-08
  • 2017-06-21
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多