2015-04-07 223 views
-2

我已經編寫了自己的例程來處理矢量和矩陣,包括一些數學工具。javafx 3d無場景圖

我寧願使用沒有場景圖的JavaFX並使用自己的例程,是否可以爲每個想要渲染的Shape3D操縱一個(4x4)矩陣?

+0

我懷疑,「沒有它的場景圖」是不是你真正的意思的根源。場景圖決定了顯示內容,因此如果沒有場景圖,您將無法看到任何內容。你正在尋找像['Canvas'](http://docs.oracle.com/javase/8/javafx/api/javafx/scene/canvas/Canvas.html)甚至['WritableImage'](http ://docs.oracle.com/javase/8/javafx/api/javafx/scene/image/WritableImage.html)? –

+0

感謝您閱讀標題,而不是實際的身體... –

+0

您的問題標題是「javafx 3d without scene graph」,並且所有您的實際問題都是您已經編寫了一些線性代數例程,並希望「不使用JavaFX場景圖「。我將其餘的解釋爲你想以某種方式通過你的線性代數例程進行直接渲染。你沒有說過你想在場景圖中放置一個Shape3D,然後對它應用一個變換,這就是你在答案中所做的。 「 –

回答

0

爲了直接轉換節點而不是使其成爲變換場景圖的子節點(例如,X,Y,Z軸旋轉和平移等),可以使用單個仿射矩陣來完成所有轉換(定向/譯)

例如父了Shape3D這一類,則父透視現場

package uk.co.bedroomcoders.jfx3dedit; 

import javafx.scene.Group; 
import javafx.scene.transform.Affine; 
import javafx.scene.transform.MatrixType; 
import com.sun.javafx.geom.Vec3d; 

public class Pivot extends Group { 

    private final double[] idt={1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}; 

    public double rx,ry,rz; 
    public Affine matrix=new Affine(idt,MatrixType.MT_3D_4x4,0); 


    public Pivot() { 
     super(); 
     getTransforms().setAll(matrix); 
    } 

    public Pivot(double x, double y, double z) { 
     this(); 
     matrix.setTx(x); 
     matrix.setTy(y); 
     matrix.setTz(z); 
    } 

    public void setPosition(double x, double y, double z) { 
     matrix.setTx(x); 
     matrix.setTy(y); 
     matrix.setTz(z); 
    } 

    public Vec3d getPosition() { 
     return new Vec3d(matrix.getTx(),matrix.getTy(),matrix.getTz()); 
    } 

    // set to eular rotation retaining translation (TODO reimplement fromQuat) 
    public void updateFromEular(double rx, double ry, double rz) { 
     double cx = Math.cos(rx); 
     double cy = Math.cos(ry); 
     double cz = Math.cos(rz); 
     double sx = Math.sin(rx); 
     double sy = Math.sin(ry); 
     double sz = Math.sin(rz); 
     matrix.setMxx(cy*cz); matrix.setMxy((sx * sy * cz) + (cx * sz));  matrix.setMxz(-(cx * sy * cz) + (sx * sz)); 
     matrix.setMyx(-cy*sz); matrix.setMyy(-(sx * sy * sz) + (cx * cz));  matrix.setMyz((cx * sy * sz) + (sx * cz)); 
     matrix.setMzx(sy);   matrix.setMzy(-sx*cy);      matrix.setMzz(cx*cy); 
    } 

    // make this pivot face the a point 
    public void lookAt(Vec3d centre, Vec3d up) { 

     final Vec3d f = new Vec3d(), s = new Vec3d(), u = new Vec3d(); 
     final Vec3d t = new Vec3d(), eye = new Vec3d(); 

     eye.set(matrix.getTx(),matrix.getTy(),matrix.getTz()); 

     f.set(centre); 
     f.sub(eye); 
     f.normalize(); 

     up.normalize(); 

     t.set(f); 
     s.cross(t,up); 
     s.normalize(); 

     t.set(s); 
     u.cross(t,f); 
     u.normalize(); 

     matrix.setMxx(s.x); matrix.setMxy(u.x); matrix.setMxz(f.x); 
     matrix.setMyx(s.y); matrix.setMyy(u.y); matrix.setMyz(f.y); 
     matrix.setMzx(s.z); matrix.setMzy(u.z); matrix.setMzz(f.z); 
    } 

}