Как мне изменить этот код шейдера, чтобы изменить ось, вокруг которой объект вращается?

Я играю с кодом в этом Образец игры Unity, чтобы узнать, как преобразовывать объекты с помощью шейдеров. В игре используются шейдеры для искривления мира, и один из этих шейдеров также заставляет объекты вращаться вокруг своей оси Y. Я хотел бы изменить его, чтобы вместо этого вращать объект вокруг оси Z.

Я пытался поменять местами z и y, но хотя это заставляет цилиндр, который я использую для этого эксперимента, вращаться вокруг оси z, это также заставляет цилиндр растягиваться. Только изменение rotVert.z на rotVert.y заставляет цилиндр вращаться на боку под углом 45 градусов. Может ли кто-нибудь сказать мне, где я ошибаюсь?

Вот код, который заставляет объект вращаться вокруг оси Y:

float4 rotVert = v.vertex;
rotVert.z = v.vertex.z * cos(_Time.y * 3.14f) - v.vertex.x * sin(_Time.y * 3.14f);
rotVert.x = v.vertex.z * sin(_Time.y * 3.14f) + v.vertex.x * cos(_Time.y * 3.14f);

o.vertex = UnityObjectToClipPos(rotVert);

person ninjachicken1    schedule 11.02.2019    source источник
comment
Не могли бы вы оставить код вращения вокруг y таким же, но добавить матрицу вращения ко всем вершинам, чтобы вращать весь объект после вращения?   -  person David    schedule 11.02.2019
comment
Я понятия не имею, что это значит, кроме как оставить код в покое, но я посмотрю.   -  person ninjachicken1    schedule 12.02.2019


Ответы (1)


На самом деле, это очень просто. Вам также необходимо изменить значение x.

            float4 rotVert = v.vertex;
            rotVert.y = v.vertex.y * cos(_Time.y * 3.14f) - v.vertex.x * sin(_Time.y * 3.14f);
            rotVert.x = v.vertex.y * sin(_Time.y * 3.14f) + v.vertex.x * cos(_Time.y * 3.14f);

            o.vertex = UnityObjectToClipPos(rotVert);

введите здесь описание изображения

person chenjd    schedule 13.02.2019
comment
Это не работает для меня. Хотя это заставляет мой цилиндр вращаться вокруг правильной оси, он вытягивается в цилиндр другой формы и имеет странный 2D-эффект при вращении. - person ninjachicken1; 18.02.2019
comment
вы можете отключить динамическую пакетную обработку либо глобально в настройках сборки, либо с помощью документов шейдера. unity3d.com/Manual/SL-SubShaderTags.html. Пакетная обработка объединяет объекты вместе, перемещая центр сетки в начало координат. - person Brice V.; 18.02.2019