2013-10-03 22 views
2

我是three.js和WebGL的新手。如何確定大物體前面的小物體和相機可見的物體?

在我的應用程序中,有3D場景,其中兩個對象。

  1. 對象 - 它是一個大球體;
  2. 對象 - 一個較小的球體,它位於第一個對象的表面上。

大球圍繞其軸旋轉。而且還有可能圍繞球體旋轉相機。

所以作爲一個大球體表面上的小球體,它也隨之旋轉。小球體對於我們來說是可見的,因爲大球體轉向攝像機,並且當大球體位於其前方時它將不可見。

問題是,我該如何確定相機可以看到一個小球體,以及何時不可見?

此外,我需要在2d中獲取小球體的可見座標。我怎樣才能做到這一點?

+0

你好邁克,歡迎來到stackoverflow :)這個問題似乎很好的研究,但它可以使用你的一些編輯,以獲得一個建設性的答案。如果你能指出你正在使用的部分實現來追蹤它們的空間位置,那將是很好的。 –

+0

謝謝:)你說得對 - 格式越少答案就越少。 – Mike

回答

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*/; 

直觀上,小球時可見它的距離小於大球,用小球體半徑的緩衝區。

要回答你的第二個問題,找到任何物體的2D座標can accomplished like this