2011-06-15 83 views
1

給定視錐體(由x,y,z相機位置,旋轉[0-360]和音高[0-180)以及視角(例如45)定義)用於確定一個盒子(由兩個相對的角點定義)是部分還是完全在該平截頭體內的Java代碼是什麼(優選最快)?查看截錐體在Java中剔除盒子

更確切地說,我該如何完成以下工作?

static boolean isBoxInFrustum(float cx, float cy, float cz, // Vector camera, 
     float rotation, float pitch, float angle, 
     float p1x, float p1y, float p1z, // Vector point1, 
     float p2x, float p2y, float p2z) { // Vector point2 
    //... 
} 

A C++實現可以在http://www.lighthouse3d.com/tutorials/view-frustum-culling/

編輯發現:這裏的2D版,也就是隻有4線,在我看來很容易,一看就明白 - 怎麼可以把它修改爲3d檢查?

static boolean isPointInFrustum(
     Vector cam, float rot, float pitch, float ang, Vector point) { 
    Vector diff = cam.minus(point); 
    float deg = Maths.arctan(diff.y, diff.x) + rot + 360; 
    deg %= 360; 
    return (deg > 180-ang && deg < 180+ang); 
} 

回答

-1

除了基本的語法,Java代碼和C++代碼有什麼不同?我注意到該網站上的C++代碼比上面的界面更加面向對象。你能不能建一個FrustumR類像燈塔代碼和Vec3類,然後添加一個方法:

int FrustumR.pointInFrustum(Vec3 p) 

由於該方法的身體不使用指針(僅算術)交易,你應該能夠基本上粘貼它,它將在Java中工作。

如果無法實現這些類,無論出於何種原因,您應該能夠通過將對這些類的成員的引用更改爲對您的參數的引用來翻譯C++代碼。

+0

注:我指的是[本頁]上的代碼(http://www.lighthouse3d.com/tutorials/view-frustum-culling/radar-approach-implementation/),我認爲你也是這樣。 – mgiuca 2011-06-15 07:39:38

+0

另請參見:閱讀燈塔代碼,它看起來像Vec3類使用運算符重載,這在Java中不可用。你需要爲此編寫一些方法。例如,而不是'Vec3 v = p-camPos',您需要編寫'Vec3 v = p.minus(camPos)'。 – mgiuca 2011-06-15 07:41:09

+0

該網站上的代碼使用相機參考,以及近和遠的剪切平面。請參閱上面的內容,瞭解我可用的內容如果您明顯知道如何製作相機參考,或者如何重寫代碼以使用旋轉和俯仰,請解釋一下,因爲無論出於何種原因,我所鏈接的教程都將我置於黑暗中。 (評論/問題應使用「添加評論」發佈。) – 2011-06-15 08:33:48