2014-01-27 5 views
0

im пытается построить 3D-модель, создавая динамически 3D-модели и переведя их туда, где они мне нужны.Java 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

Мой первый цилиндр в порядке, но мой второй цилиндр не помещается в нужном месте. Я могу добавить любое значение для значений размера и угла, поэтому мне нужно рассчитать эти два значения динамически.

Помогите решить эту проблему?

Благодарим вас заблаговременно.

+0

Как просто изменить 'last_coordinates' перед созданием цилиндра 2.' last_coordinates.add (новый Tuple3f (0, -height/2, 0)); ' –

+0

Он не решит мою проблему. Если у меня есть другой угол для первого цилиндра, это не удастся. – Bugdr0id

+0

@ user1907954: Вы должны применить все преобразования первого цилиндра к точкам, которые вы добавляете к 'last_coordinates'. –

ответ

1

Первый шаг здесь - дать каждому цилиндру другой цвет, чтобы вы могли видеть, какой из них.

Далее: Когда вы создаете цилиндр, он центрируется в начале координат. Так как вы хотите связать их в конечной точке, вам необходимо их соответствующим образом переместить: во-первых, вам нужно переместить цилиндр (или его матрицу преобразования) на пол-высоты, чтобы фактически переместить «начало цилиндра» до конца.

Следующим шагом является то, что вам необходимо применить одну и ту же матрицу преобразования к конечной точке (на этот раз плюс полную высоту цилиндра), чтобы она соответствовала фактической конечной точке.

Это говорит о том, что я предлагаю вам создать вспомогательную функцию, которая может создать цилиндр между двумя точками. Это позволит вам сказать:

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

или даже создать вспомогательную функцию, которая принимает список точек и создает все цилиндры между ними.

+0

Спасибо за ваш ответ! На данный момент я получил первый и второй шаги (цвет и заменил начало в нижней части моего первого цилиндра) [progess here] (http://imagizer.imageshack.us/v2/800x600q90/716/qyy6.png) Теперь я не знаю, как действовать. «Следующим шагом является то, что вам нужно применить одну и ту же матрицу преобразования к конечной точке (на этот раз плюс полную высоту цилиндра), чтобы она соответствовала фактической конечной точке». Как я могу выполнить этот шаг? Благодарю. – Bugdr0id

+0

Точка в источнике, это ваша начальная или конечная точка? –

+0

начальная точка; Я переместил объект + height/2 по оси X. – Bugdr0id