Raycaster не перемещает объекты BoxMesh

Я использую скрипт Physijs для физики, такой как гравитация. Я хочу перемещать объекты в своей сцене с помощью Raycaster из THREE.js скрипта. Моя проблема в том, что Raycaster перемещает только объекты (простой ящик), объявленные следующим образом:

var box = new Physijs.Mesh(cubeGeomtery.clone(), createMaterial);

Но тут физика не работает. Это работает, только если я объявлю это так:

var create = new Physijs.BoxMesh(cubeGeomtery.clone(), createMaterial);

А вот рейкастер/мувинг не работает.

Разница между ними в том, что в первом просто Mesh, а во втором BoxMesh.

Кто-нибудь знает, почему это не работает? Мне нужно BoxMesh, чтобы использовать гравитацию и другую физику.

Код для добавления куба

function addCube()
        {
            controls.enable = false;
            var cubeGeomtery = new THREE.CubeGeometry(85, 85, 85);
            var createTexture = new THREE.ImageUtils.loadTexture("images/rocks.jpg");
            var createMaterial = new THREE.MeshBasicMaterial({ map: createTexture });
            var box = new Physijs.BoxMesh(cubeGeomtery.clone(), createMaterial);
            box.castShadow = true;
            box.receiveShadow = true;
            box.position.set(0, 300, 0);
            objects.push(box);
            scene.add(box);
        }

person Rok    schedule 02.01.2016    source источник
comment
cubeGeomtery это опечатка? Кажется, должно быть написано cubeGeometry.   -  person user513951    schedule 02.01.2016
comment
Это моя кубическая геометрия var cubeGeomtery = new THREE.CubeGeometry(85, 85, 85);   -  person Rok    schedule 02.01.2016
comment
Я не могу найти Physijs.Mesh в документации по адресу github.com/chandlerprall/Physijs/wiki/ Базовые фигуры. Можете ли вы опубликовать больше вашего кода?   -  person user513951    schedule 02.01.2016
comment
Похоже, Mesh принадлежит THREE.js. Если я создаю var create = new THREE.Mesh(cubeGeomtery.clone(), new THREE.MeshLambertMaterial({ color: 0x0000ff })); Moving, все работает нормально. Но если я создаю объект с кодом выше (new Physijs.BoxMesh), он не работает   -  person Rok    schedule 02.01.2016


Ответы (1)


Объяснение

В Physijs все примитивные формы (например, Physijs.BoxMesh) наследуются от Physijs.Mesh, который, в свою очередь, наследуется от THREE.Mesh. В конструкторе Physijs.Mesh есть небольшой внутренний объект: поле ._physijs. И в этом объекте есть... тип формы, по умолчанию установлено значение null. Это поле должно быть переназначено одним из его дочерних элементов. Если нет, то при передаче формы на сцену рабочий скрипт Physijs не будет знать, какую форму генерировать, и просто прервется. Поскольку Physijs.Scene наследуется от THREE.Scene, сцена сохраняет внутреннюю ссылку на меш, как и должно быть, а это означает, что все методы из THREE.js будут работать (например, raycasting). Однако он никогда не регистрируется как физический объект, поскольку у него нет типа!

Теперь, когда вы пытаетесь переместить Physijs.BoxMesh напрямую с его полями положения и поворота, он немедленно переопределяется обновлениями физики, которые начались с метода .simulate в вашем объекте сцены. При вызове он делегирует рабочему процессу вычисление новых позиций и поворотов, которые соответствуют физическим конфигурациям вашей сцены. По завершении новые значения передаются обратно в основной поток и автоматически обновляются, так что вам не нужно ничего делать. В некоторых случаях это может быть проблемой (например, в этом случае!). К счастью, разработчик включил в Physijs.Mesh 2 специальных поля: флаги .__dirtyPosition и .__dirtyRotation. Вот как вы их используете:

// Place box already in scene somewhere else
box.position.set(10, 10, 10);

// Set .__dirtyPosition to true to override physics update
box.__dirtyPosition = true;

// Rotate box ourselves
box.rotation.set(0, Math.PI, 0);
box.__dirtyRotation = true;

Флаги сбрасываются на false после повторного обновления сцены с помощью метода .simulate.

Вывод

В принципе бесполезно создавать Physijs.Mesh самостоятельно, вместо этого используйте один из предоставленных примитивов. Это просто оболочка для THREE.Mesh для Physijs и не имеет физических свойств, пока не будет должным образом изменена одним из его дочерних элементов.

Кроме того, при использовании сетки Physijs всегда устанавливайте свойство .__dirtyPosition или .__dirtyRotation в объекте для прямого изменения положения или поворота соответственно. Взгляните на приведенный выше фрагмент кода и здесь. .

person XavCo7    schedule 23.09.2016