LibGDX ModelInstance - невозможно сбросить масштаб, настройка преобразования при масштабировании приводит к деформации модели - PullRequest
0 голосов
/ 09 января 2020

Есть ли способ сбросить масштаб modelInstance или установить позицию modelInstances без использования transform.set? Я делаю создателя 3D-монстров. Когда часть выбрана, набор 3D-стрелок перемещается на часть и становится видимым, позволяя перетаскивать часть. До меня дошло, что установка положения стрелки в масштабном масштабе сильно деформирует стрелу по любой причине. Это огромная проблема, так как мне нужно, чтобы стрелки были разных размеров в зависимости от размера детали. Без положения установки , с положением настройки . Использование transform.set в немасштабированном ModelInstance (или в масштабе 1) работает нормально.

Я думал, что решением будет сброс размера стрелки перед ее перемещением, а затем изменение масштаба после нее был перемещен, но, кажется, нет никакого способа сделать это, и использование transform.scale(-currentScale, -currentScale, -currentScale) инвертирует стрелку и увеличивает ее размер, а не уменьшает ее.

Вот как я изменяю положение стрелки: arrow[j].transform.set(modelInstance[i].transform.getTranslation(new Vector3(), arrow[j].transform.getRotation(new Quaternion());

1 Ответ

0 голосов
/ 10 января 2020

Хорошо, я сделал некоторые записи и обнаружил, что масштабирование изменяет все значения в matrix4, а не только размер экземпляра модели. Я не нашел способа только масштабировать вращение, но нашел способ обойти это: я создал пустую Matrix4 и установил ее в качестве копии матрицы стрелок перед масштабированием. Когда стрелки должны быть расположены в детали, я установил матрицу стрелки в baseMatrix, использовал transform.set, чтобы изменить положение стрелок, а затем изменил масштаб стрелки.

    if(Intersector.intersectRayBoundsFast(pickRay, modelInstance[i].boundingBox)) {
        modelInstance[i].transform.getTranslation(modelInstance[i].position);//get the part's position and store it
        for(int j = 0 ; j < 3 ; j++) {
            arrow[j].transform = arrow[j].baseTransform.cpy();//reset the arrows transform
            arrow[j].transform.getRotation(arrow[j].rotation);//get the arrow's (unscaled) rotation and store it
            arrow[j].transform.set(modelInstance[i].position, arrow[j].rotation);//set the arrow's position and rotation
            arrow[j].changeSize('S');//rescale the arrow
        }

        break;
    }
...