Angular 7.2.15 + три 0.105.2 не работает после обновления three.js - PullRequest
0 голосов
/ 06 июня 2019

Я обновил угловой с V-7.2.5 до V-7.2.15 и three.js с V-0.101.2 до V-0.105.2 и получил все виды ошибок, которые я не знаю какисправить:

THREE.Box3 метод .getSize () выдает " ошибка TS2554: ожидается 1 аргумент, но получено 0."

.material.dispose () выдает" error TS2339: свойство 'dispose' не существует для типа 'Материал | Материал []'."

.material.color.set (0x00cc00); выдает « error TS2339: Свойство 'color' не существует для типа" Материал ". "

.object.material выдает « error TS2339: Свойство« материал »не существует для типа« Object3D ». »

, есть некоторые исправленияпредложил некоторые из ошибок, которые я не считаю правильными, например, типизацию некоторых переменных как any , чтобы заставить три распознавать методы.В результате три JS не ведет себя правильно.

К сожалению, официальная документация по-прежнему описывает "старые способы" утилизации материала или не объясняет, как инициализировать ожидаемый аргумент для того, чтобы старый код работал.

Кто-нибудь смог получитьпоследняя версия angular и three.js работают вместе?Можете ли вы указать мне решение?

Спасибо,

Дино

ДАЙТЕ МНЕ УЗНАТЬ

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

Когда я создаю плоскости отсечения, мне нужен их размер, и я использую код:

size: [this.aDomain.getSize().z, this.aDomain.getSize().y],

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

Больше всего тревожат все недостающие свойства, которые тормозят мой код.Как их заменить?

this.aRenderState.clipping.planes [0] .object.material. dispose () ;

this.filteredIntersects [0] .объект. материал

this.meshCollection [part] .object.material. clippingPlanes

где:

объект - это ТРИ. Меш

Мне кажется, что мне нужно изменить все приложение из-за изменений в типе материала, потраченных впустую месяцы разработки ...

1 Ответ

1 голос
/ 07 июня 2019

Не нужно тратить месяцы на разработку. Вам просто нужно принять участие в «утверждении типа» , где вы сообщаете компилятору, какой тип переменной вы ожидаете.

Пример:

this.filteredIntersects[0].object.material

Когда вы обращаетесь к .object, компилятор ожидает, что вы получите Object3D, который не имеет свойство .material. Если вы знаете, что это будет Mesh, вы можете указать, какой тип вы ожидаете:

(<THREE.Mesh>this.filteredIntersects[0].object).material

Теперь TS вынужден ожидать, что результатом из круглых скобок () будет Mesh.

Почему это так?

Этот механизм безопасности важен, потому что он защищает вас от доступа к несуществующим свойствам. Что если Object3D был Sprite, LineSegment, or Group вместо Mesh? Вы получите ошибки во время выполнения. Поэтому вам нужно сообщить компилятору, что вы знаете , что там.

Исправление вещей:

То же самое можно сделать со всеми вашими другими ошибками:

// Original:
blah.material.dispose()
// Asserted type:
(<THREE.Material>blah.material).dispose()

// Original:
bleh.material.color.set(0x00cc00);
// Asserted type
(<THREE.MeshBasicMaterial>bleh.material).color.set(0x00cc00);`

При material.color имейте в виду, что базовый класс материала не обладает .color свойством . Вы должны уточнить, с каким типом материала вы используете, прежде чем получить доступ к .color. Это связано с тем, что такие материалы, как Phong, Basic или Standard do , имеют свойство .color, а ShaderMaterial - нет.

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