gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:16:45 25 4
gpt4 key购买 nike

我正在尝试通过动态构建 3D 模型并将其转换到我需要的地方来构建 3D 模型。

我从一个基本模型开始,试图实现下图所示的效果。我想动态构建两个圆柱体,圆柱体顶部的 X,Y,Z 与第二个圆柱体底部的 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

我的第一个气缸没问题,但我的第二个气缸没有放置在正确的位置。我可以添加尺寸和角度值的任何值,因此我需要以动态方式计算这两个值。

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

提前谢谢您。

最佳答案

这里的第一步是给每个圆柱体不同的颜色,以便您可以看到哪个圆柱体是哪个。

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

下一步是您需要将相同的变换矩阵应用于终点(这次加上完整的圆柱体高度),使其与实际终点对齐。

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

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

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

关于Java 3D - 动态构建 3D 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21378362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com