Java 3D - 动态构建3D模型

时间:2014-01-27 10:25:47

标签: java 3d translation java-3d

我试图建立一个3D模型,通过动态构建3D模型并将它们转换到我需要的地方。

我从一个基本模型开始,试图实现下面的图片。我想动态构建两个圆柱体,我的圆柱体TOP的X,Y,Z将与第二个圆柱体的BOTTOM相同,X,Y,Z,如下图所示: What i want to achieve

现在我有了这段代码:

public static void main(String[] args) throws FileNotFoundException, IOException {
    int height = 10;
    int radius = 1;
    int angle = 0;

    BranchGroup objRoot = new BranchGroup();
    Cylinder cylinder;
    Vector3f last_coordinates = new Vector3f(0f,0f,0f);
    TransformGroup transf_group_cylinder = null;



    //---- Working ok -----/
    //build cylinder
    cylinder = new Cylinder(radius, height);
    transf_group_cylinder = createTransformGroup_Cylinder(new Vector3f(0f,0f,0f),angle);    
    transf_group_cylinder.addChild(cylinder);
    objRoot.addChild(transf_group_cylinder);

    last_coordinates = calculateLastPoint(height/2, angle);
    System.out.println(last_coordinates);
    //----------------------------//



    //build 2nd cylinder
    cylinder = new Cylinder(radius, height);
    transf_group_cylinder = createTransformGroup_Cylinder(last_coordinates, Math.PI/2); 
    transf_group_cylinder.addChild(cylinder);
    objRoot.addChild(transf_group_cylinder);

    OBJWriter objWriter = new OBJWriter("myObj.obj");
    objWriter.writeNode(objRoot);
    objWriter.close();

}

private static Vector3f calculateLastPoint(int height, int angle) {
    float x = (float) (height * Math.sin(angle));
    float y = (float) (height * Math.cos(angle));

    return new Vector3f(0, x, y);
}

private static TransformGroup createTransformGroup_Cylinder(
        Vector3f last_coordinates, double angle) {

    TransformGroup transf_group = new TransformGroup();

    //position the model
    Transform3D transform_origin = new Transform3D();
    transform_origin.setTranslation(new Vector3f(0, 0, 0)); 

    // set model in horizontal position
    Transform3D transf_horizontal = new Transform3D();
    transf_horizontal.rotZ(Math.PI / 2);
    transform_origin.mul(transf_horizontal);

    // rotate object
    Transform3D angleRotation = new Transform3D();
    angleRotation.rotX(angle);
    transform_origin.mul(angleRotation);

    Transform3D transform_xyz = new Transform3D();
    transform_xyz.setTranslation(last_coordinates);
    transform_origin.mul(transform_xyz); // set Transform for

    transf_group.setTransform(transform_origin);

    return transf_group;
}

使用此代码实现此目的: enter image description here

我的第一个气缸没问题,但我的第二个气缸没有放在合适的位置。 我可以添加大小和角度值的任何值,所以我需要动态计算这两个值。

有人可以帮助解决这个翻译问题吗?

提前谢谢。

1 个答案:

答案 0 :(得分:2)

这里的第一步是给每个圆柱体一个不同的颜色,让你看看哪个是哪个。

下一步:创建圆柱体时,它以原点为中心。由于您希望在终点处链接它们,因此需要相应地移动它们:首先,您需要将圆柱体(或其变换矩阵)移动半个高度,以便将“圆柱体原点”移动到它的末端。 / p>

下一步是您需要将相同的变换矩阵应用于终点(此时加上一个完整的柱面高度),因此它与实际终点对齐。

那就是说,我建议你创建一个辅助函数,可以在两点之间创建一个圆柱体。这可以让你说:

Point endPoint = cylinder(new Point(-1,.5,0), new Point(0,.5,0))
cylinder(endPoint, new Point(0,-.5,0))
...

甚至创建一个辅助函数,它接受一个点列表并在它们之间创建所有柱面。