【问题标题】:How do I determine when small object in front of big object and visible for camera?如何确定小物体何时在大物体前面并且对相机可见?
【发布时间】:2013-10-10 07:26:46
【问题描述】:

我是 three.js 和 WebGL 的新手。

在我的应用程序中,有两个物体在其中的 3D 场景。

  1. 对象 - 它是一个大球体;
  2. 对象 - 一个较小的球体,位于第一个对象的表面。

大球体围绕其轴旋转。并且还可以围绕球体旋转相机。

所以作为一个大球体表面的一个小球体,它也随之旋转。当大球体转向相机时,我们会看到小球体,而当大球体在它前面时,小球体将不可见。

问题是,我如何确定一个小球体何时对相机可见,何时不可见?

另外,我需要获取可见的小球体的二维坐标。我该怎么做?

【问题讨论】:

  • 你好 Mike,欢迎来到 stackoverflow :) 这个问题似乎已经得到很好的研究,但它可以使用你的一些编辑来获得建设性的答案。如果您能指出您用于球体跟踪其空间位置的部分实现,那就太好了。
  • 谢谢 :) 你是对的 - 格式越少答案越少。

标签: javascript three.js webgl


【解决方案1】:

这可以通过three.js 的内置raycasterprojector 功能来完成。首先,尝试查看this demo 及其源代码。这里是another example。通过这种方式,您可以确定哪些对象更接近从相机位置发出的不可见线。

否则,如果您只是对两个对象中哪个更靠近相机感兴趣,您可以简单地检查它们的哪些位置值与相机坐标的距离更小。三维距离公式会派上用场:

bigSphereDistance = Math.sqrt( Math.pow(camera.position.x - big.position.x,2) +
                               Math.pow(camera.position.y - big.position.y,2) +
                               Math.pow(camera.position.z - big.position.z,2) );
smallSphereDistance = Math.sqrt( Math.pow(camera.position.x - small.position.x,2) +
                                 Math.pow(camera.position.y - small.position.y,2) +
                                 Math.pow(camera.position.z - small.position.z,2) );
//then check...
bigSphereDistance > smallSphereDistance ? /*case*/ : /*case*/;

直观地说,当小球的距离小于大球的距离时,小球是可见的,并带有小球半径的缓冲区。

回答你的第二个问题,找到任何对象的二维坐标can accomplished like this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 2014-12-02
    • 2022-10-14
    • 2013-02-10
    • 2012-10-07
    • 1970-01-01
    • 2015-02-01
    相关资源
    最近更新 更多