【问题标题】:Ray intersection and child camera射线交叉点和子相机
【发布时间】:2019-04-12 04:42:02
【问题描述】:

我已经使用 three.js 几个星期了,并且在 光线投射 上遇到了一些不一致的问题。 这是一个简化版本,演示了我遇到的错误之一:

http://jsfiddle.net/eMrhb/12/

相机被添加到球体 mesh 以供进一步使用 TrackBallControl 例如。

scene.add(mesh);    
mesh.add(camera);

在球体上单击几下并打开控制台,没有向我们显示 raymesh 之间的预期交点。

将相机添加到场景中(http://jsfiddle.net/eMrhb/9/),问题解决:

scene.add(mesh);    
scene.add(camera);

但我可以在场景对象和相机之间使用更复杂的层次结构来满足我的需要。

这是一个限制吗?如果是,我可以使用任何解决方法吗?

【问题讨论】:

  • 我不知道你为什么被否决。这对我来说似乎是一个非常好的问题......
  • 可能是因为您没有像您声称的那样将相机直接添加到第二小提琴中的场景中。
  • 请原谅我的(英语)错误,directly 不是正确的词,我会改正的。
  • 还是谢谢@WestLangley,我自己也在认真质疑这个问题的针对性。收到您的来信真是一种解脱!

标签: three.js camera intersection raytracing


【解决方案1】:

是的,这是可以修复的。

如果相机是另一个旋转或平移对象的子对象,那么您必须在光线投射中使用不同的模式。

而不是这种熟悉的模式:

var ray = new THREE.Ray( camera.position, vector.subSelf( camera.position ).normalize() );

你必须改用这个模式:

var position = camera.matrixWorld.getPosition().clone();
var ray = new THREE.Ray( position, vector.subSelf( position ).normalize() );

three.js r.53

【讨论】:

  • 这确实解决了问题:jsfiddle.net/eMrhb/13>。非常感谢。在嵌套对象的情况下,camera.matrixWorld.getPosition().clone(); 会始终完成这项工作,还是我需要像其他对象一样通过讨厌的向量乘法和其他矩阵更新?我在 wiki 上读到 相机位置和目标会自动更新。 这仅适用于本地位置吗?
  • 我相信这个解决方案会按原样工作。我不清楚你引用的引用的维基作者是什么意思。如果您还有其他问题,请发布新问题。
猜你喜欢
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多