Угол наклона твердых предметов при вращении - PullRequest
0 голосов
/ 25 июня 2018

Я новичок в Unity и Oculus. У меня есть куча изображений (их путь и другая информация загружены из JSON файла ), которые я пытаюсь отобразить в виртуальной комнате. И хочу дать пользователю возможность, что он может перемещать эти изображения в этой комнате, используя Oculus Touch.

Я поместил Empty Object, в котором есть скрипт, который проходит через JSON, и создает a prefab object (в котором есть Rigid body, Box Collider и OVRGrabbable, чтобы его можно было захватить в ВР, комплектующие). Кроме того, у этого prefab object есть скрипт , который отвечает за загрузку изображений в Sprite.

Что работает?

Изображения визуализируются и могут быть захвачены и перемещены.

Что не работает как надо?

Я следовал этому уроку , и, как показано здесь, углы куба сохраняются довольно хорошо. Но когда изображение захватывается и поворачивается, оно не сохраняет свои боковые углы. Как показано на следующем рисунке:

enter image description here

Вопрос

Можно ли как-нибудь исправить это? Я пытался найти его в Интернете, но, поскольку я новичок в Unity, я не совсем уверен, чего именно мне не хватает.

Любые подсказки были бы очень благодарны.

Ответы [ 4 ]

0 голосов
/ 29 июня 2018

После ответа @ Adam Stox я поделюсь с вами решением, которое обычно работает в этом случае ( ссылка к исходному ответу):

Не связывайте объекты напрямую с неравномерно масштабированным родителем. дочерний этот неоднородный объект к пустому объекту, который будет родитель других объектов тоже; поскольку пустой объект масштабируется 1,1,1, наложение на него других объектов не вызывает этой проблемы.

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

0 голосов
/ 27 июня 2018

В игре может быть несколько вещей, и трудно сказать, не увидев предварительно подготовленную иерархию или источник OVRGrabbable.

Одна вещь, которая приходит на ум, это то, что вы должны манипулировать положением и вращением объекта через его твердое тело

В префабе может быть несколько встроенных преобразований, которые сохраняются, все ли правильно выровнено, прежде чем взаимодействовать с коллайдером? Также как-то вращение изображения на коллайдере похоже на вращение коллайдера относительно мира. Может быть, вы вложили два объекта?

0 голосов
/ 27 июня 2018

Я думаю, что проблема заключается в вашей иерархии. Ваш Images игровой объект (родитель вашего DisplayImage) имеет шкалу (1.88,1,1). Попытка повернуть дочерние объекты, чьи родительские объекты имеют неравномерный масштаб в Unity, дает неожиданные результаты. Попробуйте сбросить масштаб вашего объекта Images до (1,1,1) и посмотрите, поможет ли это.


Такое поведение возникает из-за характера отношений «родитель / ребенок». Система координат ребенка относительно его родителей. Мы можем думать об этом как о родителе, определяющем систему координат для наших детей. Это то, что мы называем локальное пространство . Таким образом, когда мы выполняем какие-либо линейные преобразования для родителя, мы как бы выполняем их для всей родительской системы координат, которую наши дети используют для определения своей ориентации. Таким образом, перевод родителя переместит все его потомки вместе с ним, потому что все наше локальное координатное пространство переместилось вместе с родителем. Обратите внимание, что у наших детей все еще будет тот же localPosition, но их глобальный position изменится.

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

В нашей ситуации мы масштабировали нашего родителя, таким образом масштабируя всю систему координат, которую мы используем для определения нашего дочернего объекта. Это означает, что все, что использует координатное пространство родителя, также будет масштабировано в соответствии с масштабом родителя . В нашей ситуации родитель был масштабирован на (1.88,1,1). Таким образом, все, что привязано к родителю, было также масштабировано вдоль оси X родителя на 1,88 , что привело к странному эффекту, замеченному на ваших скриншотах. Несмотря на вращение нашего дочернего объекта, он все еще масштабируется вдоль оси X родителя.

( Ссылка на официальную документацию по этому вопросу.)

Решением этого является применение ваших линейных преобразований как можно глубже в иерархии. Здесь вместо масштабирования родителя масштабируйте дочерний элемент. Если родительский объект необходимо масштабировать или его масштаб меняется на лету, другим решением было бы удалить дочерний элемент из иерархии родительский / дочерний и управлять его преобразованием на основе преобразования старого родительского объекта в сценарии. В этом случае вы можете установить положение и поворот несвязанного потомка в положение и поворот родителя, но игнорировать масштаб.

0 голосов
/ 27 июня 2018

Вы можете использовать RigidbodyConstraints , чтобы заблокировать вращение по одной оси.

Другой вариант - исправить вращение в LateUpdate с помощью сценария.

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

...