У меня есть фрагмент кода, который заставляет объект (кристалл) появляться на сфере. Я хочу, чтобы положение на сфере было случайным, и кристалл выравнивался по сфере. Я делаю это, сначала делая объект (кристалл), затем я устанавливаю положение кристаллов в центр, поскольку сфера также находится в 0, 0, 0. Затем я поднимаю дочерние элементы кристаллов (сетки) до 0, 5, 0, это означает, что они на 5 единиц выше своего родителя (также их точка разворота). Затем я получаю случайные повороты для каждой оси и применяю их к кристаллу (родителю), чтобы дети вращались вокруг своего родителя и держали расстояние в 5 единиц. Но это дает мне некоторые странные результаты.
Белые вещи - это кристаллы.
Как показано на рисунке выше кристаллов (дети) не поддерживают расстояние в 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);
}