我试图建立一个3D模型,通过动态构建3D模型并将它们转换到我需要的地方。
我从一个基本模型开始,试图实现下面的图片。我想动态构建两个圆柱体,我的圆柱体TOP的X,Y,Z将与第二个圆柱体的BOTTOM相同,X,Y,Z,如下图所示:
现在我有了这段代码:
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;
}
使用此代码实现此目的:
我的第一个气缸没问题,但我的第二个气缸没有放在合适的位置。 我可以添加大小和角度值的任何值,所以我需要动态计算这两个值。
有人可以帮助解决这个翻译问题吗?
提前谢谢。
答案 0 :(得分:2)
这里的第一步是给每个圆柱体一个不同的颜色,让你看看哪个是哪个。
下一步:创建圆柱体时,它以原点为中心。由于您希望在终点处链接它们,因此需要相应地移动它们:首先,您需要将圆柱体(或其变换矩阵)移动半个高度,以便将“圆柱体原点”移动到它的末端。 / p>
下一步是您需要将相同的变换矩阵应用于终点(此时加上一个完整的柱面高度),因此它与实际终点对齐。
那就是说,我建议你创建一个辅助函数,可以在两点之间创建一个圆柱体。这可以让你说:
Point endPoint = cylinder(new Point(-1,.5,0), new Point(0,.5,0))
cylinder(endPoint, new Point(0,-.5,0))
...
甚至创建一个辅助函数,它接受一个点列表并在它们之间创建所有柱面。