Вращение меняет положение детей неправильно - PullRequest
0 голосов
/ 24 марта 2020

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

The white things are the crystals Белые вещи - это кристаллы.

Как показано на рисунке выше кристаллов (дети) не поддерживают расстояние в 5 единиц от родителя, я проверил это, и родитель не двигается. Я понятия не имею, почему это происходит. Код ниже.

public void SpawnCrystal(){
    //Load the object I want to spawn
    Node crystal = (Node)assetManager.loadModel("Models/Crystal/Crystal.j3o");

    //This is the pivot point also the parent
    crystal.setLocalTranslation(new Vector3f(0, 0, 0));

    //Set up the materials and other things
    Material matC  = new Material(assetManager,"Common/MatDefs/Light/Lighting.j3md");
    Material matG = new Material(assetManager,"Common/MatDefs/Light/Lighting.j3md");
    Spatial c = crystal.getChild("Crystal_Object");
    Spatial g = crystal.getChild("Crystal_Ground");
    c.setMaterial(matC);
    g.setMaterial(matG);

    //This makes the objects go above the pivot point, 5 is the radius of the sphere
    //they rotate around
    c.setLocalTranslation(0, 5, 0);
    g.setLocalTranslation(0, 5, 0);

    //Get a random rotation for every axis in radians
    float randomX, randomY, randomZ;
    randomX = (float)Math.random() * 2 * (float)Math.PI;
    randomY = (float)Math.random() * 2 * (float)Math.PI;
    randomZ = (float)Math.random() * 2 * (float)Math.PI;

    //Every rotation for all the axis
    Quaternion rotX = new Quaternion();
    rotX.fromAngleAxis(randomX, new Vector3f(1, 0, 0));
    Quaternion rotY = new Quaternion();
    rotY.fromAngleAxis(randomY, new Vector3f(0, 1, 0));
    Quaternion rotZ = new Quaternion();
    rotZ.fromAngleAxis(randomZ, new Vector3f(0, 0, 1));

    //Combine them into one, I do it this way, because I don't know a better way
    Quaternion rot = new Quaternion(rotX.getX() + rotY.getX() + rotZ.getX(),
    rotX.getY() + rotY.getY() + rotZ.getY(), rotX.getZ() + rotY.getZ() + rotZ.getZ(),
    rotX.getW() + rotY.getW() + rotZ.getW());

    //Set the rotation of the parent (pivot)
    crystal.setLocalRotation(rot);

    //Attach the object to the rootNode so it's visible in scene
    main.getRootNode().attachChild(crystal);
}
...