Three.js: Ошибка SkinnedMesh при удалении от корня сцены (0,0,0)

Созданный на 9 февр. 2018  ·  113Комментарии  ·  Источник: mrdoob/three.js

Думаю, я обнаружил ошибку в вашей SkinnedMesh (проверено на iPhone 6 и 8).

Если об этом уже сообщалось, извините, я не нашел его в списке проблем :(

Кажется, скиннинг gpu работает некорректно и сходит с ума на мобильных устройствах.
Когда SkinnedMesh перемещается или перемещается в положениях с высокими значениями (например: x: 0, y: 0, z: 1000), снятие кожи больше не является точным и запускается танец паука.

На ошибку влияет масштаб меша.

Кажется, что значения костей скелета не вычисляются правильно для каждого кадра, а boneTexture / boneMatrix в шейдере скиннинга перемещает вершины в неправильное место.
Конечно, это просто мое ощущение.

Я провел много тестов, прежде чем опубликовать это ... в поисках подсказки в моем анимированном экспорте, но я обнаружил, что ошибка возникает с любыми форматами (GLTF, FBX, Collada, JSON, ...) и моделями из репозитория ThreeJS.

Это очень раздражает, потому что это означает, что мы не можем разработать простую игру-раннер с работающим аватаром (avatar.position.z увеличивается тогда) без этой проблемы: ((
Я до сих пор не знаю, как мне это удастся, поскольку morphTargets не подходит :(

Надеюсь, вы можете здесь помочь.

Я привел четкие примеры с чистым исходным кодом, чтобы выявить проблему. Проверить это на смартфоне довольно просто:

Отображается только на мобильных устройствах (z = 10000):
http://cornflex.org/webgl/skinning-bug.html

Если для floatVertexTextures установлено значение false (z = 10000):
http://cornflex.org/webgl/skinning-bug2.html

Ухудшение с увеличением расстояния (z увеличивается):
http://cornflex.org/webgl/skinning-bug3.html

Очень-очень далеко от центра (z = 70000000)> ошибка также появляется на рабочем столе, но, безусловно, из-за проблемы точности с плавающей запятой:
http://cornflex.org/webgl/skinning-bug4.html

Предварительный просмотр видео в моей игровой среде:
Это мир реалистичного масштаба (1.0m = 1.0 threejs unit).
Ошибка появляется только после 50-60 м от корня сцены и ухудшается с расстоянием:
http://cornflex.org/webgl/skin-bug.mp4

ОЧЕНЬ ВАЖНО
Сетка, используемая в репозитории ThreeJS, слишком велика. Это примерно 20 метров в высоту.
Вот почему значение z должно быть больше, чтобы увидеть ошибку.
Если эту сетку уменьшить до реалистичного размера, ошибка начинает появляться даже на 100 м.

Версия Three.js
  • [x] Dev
  • [x] r89
  • [Икс] ...
Браузер
  • [ ] Все они
  • [] Chrome
  • [ ] Fire Fox
  • [] Internet Explorer
  • [x] Safari
Операционные системы
  • [ ] Все они
  • [] Windows
  • [] macOS
  • [] Linux
  • [] Android
  • [x] iOS
Требования к оборудованию (видеокарта, устройство VR, ...)

iPhone 6, 8

Самый полезный комментарий

Хочу выделить этот раздел пользователя zeoverlord :

Дрожание является естественным только для чисел с плавающей запятой, переменные теряют точность, чем выше число, поэтому точность тем лучше, чем ближе к 1.0. На самом деле это не проблема, но это означает, что если вы выполняете много матричных вычислений с огромными числами, у вас будет большое ухудшение точности (также известное как дрожание). Поэтому вам нужно проделать всю свою математику вокруг начала координат с разумными числами, а затем перевести их.

Все 113 Комментарий

Ваша демонстрация хорошо смотрится на моем Pixel.

Подтвержденные проблемы на моем iPhone SE -

img_6324

Возможно, проблемы с точностью WebGL в iOS

Но на самом деле устройства iOS используют путь кода реализации скинов на основе текстуры с плавающей запятой, верно? Можете ли вы проверить это с помощью следующего теста на соответствие?

https://www.khronos.org/registry/webgl/conformance-suites/1.0.3/conformance/extensions/oes-texture-float.html

У iPhone SE на этой странице пять сбоев. 😕

Я сделал небольшой скринкаст, чтобы показать вам в своем проекте:
http://cornflex.org/webgl/skin-bug.mp4

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

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

... почему только на iphone тогда: /

Я застрял ... Я переориентируюсь на последовательности png в качестве плана резервного копирования ... :(

Скорее всего, это связано с тем, что iphone 6 не поддерживает достаточное количество костей.

У меня была точно такая же проблема.

Проверьте свой предел кости здесь: https://virtulo.us/2/vr/test

Я так не думаю.
Если skinnedmesh остается на 0,0,0, проблем нет: /
Я даже подумываю переместить все активы вместо аватара ... (это мой обходной путь №2), но, конечно, я бы предпочел, чтобы скелет работал так же хорошо, как рабочий стол.

Друг только что сообщил о той же ошибке на iPhone 8

Какие результаты вы получите с помощью следующего теста на соответствие?

https://www.khronos.org/registry/webgl/conformance-suites/1.0.1/conformance/misc/shader-precision-format.html

Посмотрев на исходники ThreeJS в течение 2 дней ... я думаю, что есть проблема, когда обновляется boneTexture.
Похоже, эта текстура не обновляется правильно, а затем возвращает вершины в исходное положение ... но я, конечно, могу ошибаться.

img_1411

Хммм ... вот у меня НЕУДАЧИ, смотри:

img_1412

Может проблема в этих фалах. Мой Pixel, например, проходит все тесты.

Давайте попробуем что-нибудь: перейдите к WebGLCapabilities и установите значение floatVertexTextures равным false (это предотвратит использование текстуры float). Сделайте сборку и используйте эту three.js версию в своем приложении. Мне любопытно, что происходит 😊.

https://github.com/mrdoob/three.js/blob/099e4364541502fdf22fc7b1c0f54239d2ba1708/src/renderers/webgl/WebGLCapabilities.js#L105

Уже пробовал floatVertexTextures = false на рендерере.
Скин перестает сходить с ума но анимации больше нет: /
Я запихну образец.

Держи:
http://cornflex.org/webgl/skinning-bug2.html

renderer.capabilities.floatVertexTextures = false;

=> Анимация больше не работает

img_1413

Да, то же самое на моем Pixel (рабочий стол работает). Я думаю, мы достигли единого предела.

Я сделал последний образец, и ошибка появлялась постепенно:
http://cornflex.org/webgl/skinning-bug3.html

Начинается с 0,0,0 и идет вперед ... подождите несколько секунд ... кожа начинает сходить с ума.

Довольно странно, что 0,0,0 все в порядке. не так ли?

z: 1255> все еще в порядке
z: 18870> сумасшедший скин

img_1415

img_1414

Как я уже сказал, я глубоко профилировал все положения скелета и костей со стороны процессора. Все значения кажутся вполне нормальными. Единственная подсказка, которую я имею, - это кости, текстуры и кости, матрицы, которые некорректно работают на iOS, когда меш уходит далеко от 0,0,0.

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

Я проверил точность плавания на стороне графического процессора в шейдерах кожи, но опять же ... похоже, ничего не влияет.

Очень странно, что никто не перемещал SkinnedMesh внутри сцены и никогда не сообщал об этом: /

Еще один вопрос: у вас такая же проблема с Chrome?

Та же проблема, да.

img_1416

Похоже на проблему точности. Вы пробовали уменьшить масштаб сцены? (11195 - 11 километров).

Другой вариант - переместить сцену вместо персонажа. Обычно это обычное решение для больших сцен.

Кроме того, я предполагаю, что код скинов находится в мировом пространстве. Мы могли бы это исследовать.

Я вижу, у вас 67 костей.

У моего (жен) iphone 6 максимальное количество аппаратных костей составляет 27.

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

Почему со временем становится хуже? Без понятия. Кто-то еще упомянул нечто подобное, не уверен, связано ли это: https://discourse.threejs.org/t/updated-with-fiddle-as-animations-go-faster-there-is-increasing-error-in-accuracy/ 1707/6

Еще одна неприятная вещь, которую я обнаружил на iPhone (по крайней мере, на iphone 6): я ДОЛЖЕН использовать высокую точность шейдеров, средние и низкие частоты не искажают сетку таким же пугающим образом (как моя проблема с костями на телефоне), но текстуры выглядят странный и искаженный / пиксельный во время анимации.

Какой у вас предел аппаратной кости на тестируемом устройстве?

@mrdoob Я уже пытался уменьшить масштаб, но на самом деле
Если вы уменьшите масштаб на 0,1, то ошибка появится в 10 раз быстрее.

Демо, которое я использовал здесь для объяснения, взято из примеров threejs.
В моей игре масштаб не такой большой, но ошибка та же самая, только появляется быстрее.

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

Перемещение всего мира вместо аватара - мое решение №2.
Вы должны признать, что это плохой выбор, если вы разработали всю рутину раннера в мировом пространстве, уже с физикой и всем остальным. И z = 11000 - это не так уж и далеко для раннера: / ... и это просто бегущий человек, а не корабль.

Я сделал много игр с помощью ThreeJS, но это первый раз, когда я использую скин-сетку. Эта ошибка iOS действительно раздражает.

Решение №1: я сделаю 6 последовательностей png в виде анимации таблицы спрайтов. Тогда я смогу сохранить логику мирового пространства. Срок не за горами :(

@titansoftime Проба появляется и на iPhone 8 моей жены. Это касается не только iPhone 6.
Кроме того, если у вас проблема с максимальным количеством костей, то она будет глючить с самого начала. Здесь вы можете видеть, что на 0,0,0 нет ошибок. Тогда ограничение по костям не является проблемой. Расчет костей и костей в мировом пространстве Матрица в шейдерах скиннинга - IMO.

Что такое Max Hardware Bones у iPhone 8?

Не знаю. И я не уверен, что это зависит от устройства.

Но опять же ... ИМО, это вообще не связано со значением maxbones.

Образец работает правильно на iphone 6,8, X ... даже 5 ... только когда SkinnedMesh остается на 0,0,0
https://threejs.org/examples/webgl_loader_fbx.html

Если бы проблема была с maxbones, у нас не было бы хорошего скиннинга на 0,0,0.

Хочу выделить этот раздел пользователя zeoverlord :

Дрожание является естественным только для чисел с плавающей запятой, переменные теряют точность, чем выше число, поэтому точность тем лучше, чем ближе к 1.0. На самом деле это не проблема, но это означает, что если вы выполняете много матричных вычислений с огромными числами, у вас будет большое ухудшение точности (также известное как дрожание). Поэтому вам нужно проделать всю свою математику вокруг начала координат с разумными числами, а затем перевести их.

Ммм, очень интересно @ Mugen87! Похоже, вы заметили утечку.

z: 1255> все еще в порядке
z: 18870> сумасшедший скин

Ошибка может быть на вашей стороне.
Распространенная ошибка: модификатор кожи был применен неправильно.
Ошибка 1: вершины контролируются слишком большим количеством костей
Ошибка 2: вершины без веса (или с очень маленьким весом).

Когда SkinnedMesh близок к исходной точке (0,0,0), вы не заметите этих ошибок.
Но если отодвинуть далеко ... вы будете обвинять точность мобильного устройства.
Итак, первое, что нужно сделать, - это изменить (на этот раз правильно) модификатор кожи.

@RemusMar Вы смотрели источник страницы?
Пример, который я показал, взят прямо из источников ThreeJS.

Достаточно хорошо упомянуто в моем описании;)

Я провел много тестов, прежде чем опубликовать это ... в поисках подсказки в своих анимированных экспортах, но обнаружил, что ошибка возникает с любыми форматами (GLTF, FBX, Collada, JSON, ...)

Я привел ясный пример с чистым исходным кодом, чтобы выявить проблему. Проверить это на смартфоне довольно просто:

http://cornflex.org/webgl/skinning-bug.html

Пример, который я показал, взят прямо из источников ThreeJS.

И что?

Как ошибка может быть на моей стороне, когда это происходит со всеми примерами skinnedmesh из ThreeJS :)

Вы сказали:

Ошибка может быть на вашей стороне.
Распространенная ошибка: модификатор кожи был применен неправильно.
Ошибка 1: вершины контролируются слишком большим количеством костей
Ошибка 2: вершины без веса (или с очень маленьким весом).

FBX от ThreeJS ... и вы можете попробовать GLTF или любой другой формат. Проблема такая же.

var loader = новый THREE.FBXLoader ();
loader.load ('https://threejs.org/examples/models/fbx/xsi_man_skinning.fbx', OnFBXLoaded);

@ Mugen87 нашел ключ к разгадке. Будем надеяться, что парень, создавший сетку со скинами для графического процессора, сможет это исправить.

Как ошибка может быть на моей стороне, когда это происходит со всеми примерами skinnedmesh из ThreeJS

Я сказал: «Ошибка может быть на вашей стороне».
Нижняя линия:
Используйте простой SkinnedMesh с правильно нанесенным модификатором кожи:

  • максимум 4 кости на вершину
  • все веса = 1.0000

Посмотрите, сможете ли вы воспроизвести ошибку.

Вы с ума сошли? :)
Эта ошибка не может быть на моей стороне ... модели (fbx, gltf, dae, что угодно) и исходный код взяты из ThreeJS.

Прочтите сообщения

Используйте простой SkinnedMesh с правильно нанесенным модификатором кожи:

  • максимум 4 кости на вершину
  • все веса = 1.0000

Посмотрите, сможете ли вы воспроизвести ошибку.

Сейчас я должен идти.
ура

Хммм. Знаете что, ребята? Это происходит и на рабочем столе :(

Поскольку сетка в примере ThreeJS огромна (100 м в высоту), я разместил ее очень-очень далеко: z = 10000000
И посмотрите, та же проблема:
http://cornflex.org/webgl/skinning-bug4.html

Это определенно что-то, связанное с позициями костей в мировом пространстве и вычислениями boneMatrix, как показано @ Mugen87 :

https://www.opengl.org/discussion_boards/archive/index.php/t-159613.html
https://www.opengl.org/discussion_boards/archive/index.php/t-159364.html

Как объяснялось ранее в @mrdoob , я уже пытался

В моей собственной игре (с реалистичными масштабами 1: 1) ошибка проявляется уже на z: 100.

Вы продолжаете использовать меши с плохим дизайном ...
В любом случае, чтобы закрыть эту тему, вот пример от 1 до 1 000 000 (один миллион !!!):
http://necromanthus.com/Test/html5/Lara_1000000.html
Нажмите на сцену, чтобы переключиться между Y = 0 и Y = 1000000.
Для каждого переключателя доступно небольшое глобальное изменение освещения.
Так что, если сетка со скином правильно спроектирована, результат (близкий к) идеальный.
ура

Мы рассмотрим это после релиза в этом месяце.

@mrdoob Спасибо.

@RemusMar Вы продолжаете игнорировать то, что здесь было сказано. Пожалуйста, прочтите всю ветку еще раз :)

Я только что привел вам рабочий пример, но вы все еще не понимаете.
http://necromanthus.com/Test/html5/Lara_1000000.html

И вы продолжаете говорить о плохих практиках .
Имейте в виду следующее:
Число цифр с плавающей запятой одинарной точности равно 7.
Это покрывает 1234 567 и 12 3456,7
Большинство карт весов имеют 4 знака после запятой, но даже одна дает достойные результаты.
По этой причине все 3D-движки рекомендовали максимальное значение 10 000 для размера мира.
С 0000.001 до 9999.999
Все мы хотим «бесконечных» или огромных трехмерных миров, но это невозможно.
То, что вы делаете, совершенно неправильно со многих точек зрения:
игровой дизайн, перформансы, анимации и коллизии.
Надеюсь, теперь у вас есть основная картина.

@RemusMar
Я хорошо понял, что вы сказали, но, к сожалению, у вашей модели такая же проблема ... в меньшей степени, но все еще есть:
http://cornflex.org/webgl/skin-bug2.mp4

Источник:
http://cornflex.org/webgl/skinning-bug5.html

А если ставлю позицию выше z = 60000, становится хуже ... а до 100000 совсем не видно.

Все мы хотим «бесконечных» или огромных трехмерных миров, но это невозможно.

LOL, я не хочу бесконечного огромного мира ... Я просто хочу создать раннер-игру, как я много раз делал раньше с ThreeJS ... но на этот раз мне нужна скиннед сетка в качестве аватара.

Моя сцена: http://cornflex.org/webgl/skin-bug.mp4

Если мы не можем оживить аватар, бегущий на несколько метров ... тогда какой смысл ?? (в реалистичном масштабе 1м = 1 блок threejs, баг появляется уже из 100).

Кстати, ваша модель примерно 150 метров в высоту ... это не реалистичный масштаб.
РЕДАКТИРОВАТЬ:
Вот та же сцена с масштабом (0,01, 0,01, 0,01) на вашей модели, чтобы получить реалистичный размер (тогда около 1,5 м). Как видите, на мобильном устройстве уже глючит z = 300:
http://cornflex.org/webgl/skin-bug3.mp4

То, что вы делаете, совершенно неправильно со многих точек зрения:
игровой дизайн, перформансы, анимации и коллизии.

LOL LOL ... Я предлагаю посетить мои веб-сайты и блог о создании игр (http://quentinlengele.com, http://cornflex.org, http://www.ddrsa.com, http://br9732.com )

РЕДАКТИРОВАТЬ: ваша сцена не отображается на iOS, пустой экран (http://necromanthus.com/Test/html5/Lara_1000000.html).
img_1418

Скиннинг, кажется, выполняется в мировом или локальном пространстве, но растягивается при перемещении далеко от центра. Вот почему он неплохо работает на 0,0,0

Посмотрим:

vec3 transformed = vec3( position );
...
#ifdef USE_SKINNING
    vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );
    vec4 skinned = vec4( 0.0 );
    skinned += boneMatX * skinVertex * skinWeight.x;
    skinned += boneMatY * skinVertex * skinWeight.y;
    skinned += boneMatZ * skinVertex * skinWeight.z;
    skinned += boneMatW * skinVertex * skinWeight.w;
    transformed = ( bindMatrixInverse * skinned ).xyz;
#endif

не похоже на мировое пространство? в обычной сетке transformed устанавливается в атрибут position то есть локальные координаты.

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

(править: nvm, я думаю, что это неправильно)

me

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

Как я уже сказал, с расчетом матриц костей наверняка что-то не так, или, возможно, порядок расчета этих матриц неправильный. Как вы можете видеть на форуме OpenGL и как упоминал @ Mugen87 , это самая важная подсказка, по крайней мере, для меня:

Дрожание является естественным только для чисел с плавающей запятой, переменные теряют точность, чем выше число, поэтому точность тем лучше, чем ближе к 1.0. На самом деле это не проблема, но это означает, что если вы выполняете много матричных вычислений с огромными числами, у вас будет большое ухудшение точности (также известное как дрожание). Итак, вам нужно проделать всю свою математику вокруг начала координат с разумными числами, а затем перевести их.

Опять же, как объяснялось, на ошибку влияет масштаб объекта.
Пример с исходными кодами ThreeJS представляет эту ошибку только при z = 100000, но это потому, что размер меша (также полученного из источника ThreeJS) огромен. Рост бегущего мальчика 150 метров.

Когда вы делаете игру, вы, конечно же, не пользуетесь такой шкалой. Вы всегда стараетесь сохранить свой мир с 1 м = 1 единица. Это даже обязательно для получения хорошей физики и поведения.

Проблема здесь в том, что вы используете SkinnedMesh с реалистичным размером: ошибка уже появляется на z = 300.

В любом движке вы можете разместить SkinnedMesh с координатами x: 30000, y: 60000, z: 140000000, и здесь нет проблем с костями и снятием кожи. Никакого дрожания.

Конечно, я хорошо понимаю, что мы работаем над ядром Javascript ... но все же.

Здесь троллям, которые притворяются, что «все мы хотим бесконечных миров, но это невозможно», нужно вернуться в школу и изучить матричные преобразования. Или лучше взгляните на игры с открытым миром и спросите их, как их аватар может быть "скован сеткой" так далеко от корня сцены 0,0,0 ......

Я должен сказать, что это забавный баг. Здесь я мог воспроизвести это на рабочем столе, но 60K было недостаточно, чтобы выйти из строя:
needs more zeroes

Хорошо, поэтому при z = 1e8 вот что у нас с текущим шейдером:

screen shot 2018-02-14 at 1 15 56

и вот что у нас есть, если мы изменим шейдер на этот (небольшая вариация моего вышеприведенного теста, который я отредактировал):

#ifdef USE_SKINNING
    vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );
    vec4 skinned = vec4( 0.0 );
    skinned += ( bindMatrixInverse * boneMatX ) * skinVertex * skinWeight.x;
    skinned += ( bindMatrixInverse * boneMatY ) * skinVertex * skinWeight.y;
    skinned += ( bindMatrixInverse * boneMatZ ) * skinVertex * skinWeight.z;
    skinned += ( bindMatrixInverse * boneMatW ) * skinVertex * skinWeight.w;
    transformed = skinned.xyz;
#endif

screen shot 2018-02-14 at 1 16 54

все еще шатко, но выглядит лучше :) Что это значит в контексте данной проблемы?

Во-первых, вы не можете просто скопировать и вставить этот хак в шейдер. Я имею в виду, что вы можете, но он заменяет 1 матричное умножение на 4. Вместо этого я предлагаю либо а) объединить матрицу костей с обратной связью матрицы на стороне js и передать как единую униформу, либо б) создать другую униформу только для этого кусок шейдера. Тогда это решит эту проблему (в некоторой степени) и уменьшит количество умножений матриц в шейдере (на 1).

о, и

Здесь тролли делают вид, что «мы все хотим бесконечных миров, но это невозможно»

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

@makc Спасибо, что
К сожалению, уже слишком поздно. Я должен доставить пятницу. В качестве обходного пути я использовал последовательности PNG.

Если вы хотите отладить это достаточно глубоко. Не могли бы вы использовать реалистичный размер сетки?
Опять же, эта модель Лары тоже примерно 60 метров в высоту, если я хорошо помню.

Мне, конечно, любопытно посмотреть, работает ли ваш патч в реалистичном масштабе :)

Да и ... вы делаете свой тест под iOS?
Как объясняется в этой теме, в основном это происходит на устройствах iOS (6, 8).
На рабочем столе проблема возникает только при очень больших значениях.

еще раз спасибо

@OrtOfOn вы можете попробовать патч @makc , добавив его вверху кода:

THREE.ShaderChunk.skinning_vertex = `
#ifdef USE_SKINNING
    vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );
    vec4 skinned = vec4( 0.0 );
    skinned += ( bindMatrixInverse * boneMatX ) * skinVertex * skinWeight.x;
    skinned += ( bindMatrixInverse * boneMatY ) * skinVertex * skinWeight.y;
    skinned += ( bindMatrixInverse * boneMatZ ) * skinVertex * skinWeight.z;
    skinned += ( bindMatrixInverse * boneMatW ) * skinVertex * skinWeight.w;
    transformed = skinned.xyz;
#endif
`;

THREE.WebGLShader: шейдер не скомпилирован. : /

patch

о чувак. вы получили неправильные кавычки и однострочное форматирование. как вы так копируете?

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

@makc CTRL + C / CTRL + V ... отсюда ...: /

К сожалению, ошибка менее сильная, чем раньше, но все же существует :(

Проверено на iOS (применен патч):

Сетка в масштабе 1.0 (высота аватара ровно около 20 м), позиция z = 10000
http://cornflex.org/webgl/skin-patch1.mp4

Сетка в масштабе 0,1 (высота аватара около 2 м), положение z = 3000
http://cornflex.org/webgl/skin-patch2.mp4

@mrdoob Попробую воспроизвести :) Оказалось в одной строчке. Я писал на странице, когда увидел, как появляется ваш ответ, и он не выглядел так, как обычно, я обещаю: p ... Я получу эти бонусные баллы, вы увидите :)

EDIT: Кстати, вы редактировали свой пост? :)

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

@OrtOfOn на вашем месте, я бы попытался обернуть всю вашу сцену (с камерой) в дополнительный Object3D и установить координаты этого объекта на -1 * координаты аватара каждый кадр. Это навсегда сохранит его в мировых координатах 0,0,0.

@markc Мне правда не нравится вот так жульничать. Геймплей и сцена не предназначены для таких мучений, и в качестве первой мобильной игры производительность, конечно же, должна быть оптимальной.

Кроме того ... не мой случай, но представьте это с несколькими врагами в SkinnedMesh, которые приходят отовсюду ...

У меня не было выбора, потому что крайний срок, и я заменил SkinnedMesh анимацией таблицы спрайтов (клиент в порядке). В остальном я ничего подобного не встречал. Я использую ThreeJS почти в каждом веб-проекте, и мне он очень нравится.

Нам не нужны «бесконечные миры», но мы хотим иметь возможность использовать эти прекрасные функции SkinnedMesh и анимации в координатах мирового пространства, как мы это делаем в известных движках :)

Я немного разочарован ... потому что я сделал очень крутой скрипт Animator, основанный на функциях кроссфейда и вдохновленный mecanim ... Для следующего проекта, конечно: /

@markc Мне правда не нравится вот так жульничать.

Я вообще не думаю, что это обман. Вот как работают все космические симуляции. Фактически, 3D-рендеринг в реальном времени в основном смещает всю сцену, поэтому в центре находится камера.

@mrdoob да, я знаю, что камеры даже не существует. Сила матриц :) (Я сам делаю нативный WebGL / OpenGL dev).

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

@OrtOfOn на самом деле вы можете использовать саму сцену. например, в примере с ларой сделайте следующее:

scene.add(camera);
scene.position.z = -60000;

и все в порядке (отредактируйте: однако, что-то не так со светом, когда вы это делаете .... @mrdoob ?)

@makc Еще раз спасибо за предложения патчей.

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

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

Кроме того, мне весьма любопытно увидеть эти патчи в действии с более чем одним SkinnedMesh, например, враги прячутся или появляются в некоторых местах сцены. Потому что тогда какой смысл ограничиваться одним аватаром с одной скелетной сеткой на 0,0,0?

Я покопаюсь в источнике, как только смогу, но мне нужно что-то доставить за 2 дня ... так что, надеюсь, мои анимации спрайтов пока в порядке.

Потому что тогда какой смысл ограничиваться одним аватаром с одной скелетной сеткой на 0,0,0?

Дело в том, что маловероятно, что вы одновременно визуализируете скин на 0,0,0 и другой скин на z = 60000. Только несколько скинов вокруг 0,0,0 попадут на экран, и их будет недостаточно, чтобы вызвать ошибку.

@makc Опять же, ваш патч действителен для настольных компьютеров, но вы не тестируете его на устройствах iOS, где ошибка появляется уже на расстоянии нескольких метров от 0,0,0 с реалистичными масштабируемыми сетками. Я сделал к нему достаточно видео. Вот, например, ошибка только при z = 100: /
http://cornflex.org/webgl/skin-bug.mp4

Вы всегда используете в играх аватар высотой 20 м? :)
Потому что число, на котором вы сосредоточились (60000), используется только для выявления ошибки на рабочем столе (с этим очень огромным образцом lara или огромным образцом threejs fbx) ... не на мобильных устройствах. И мой аватар, конечно, не заходит так далеко ...

Я подтверждаю, что это проблема iOS. По крайней мере, начиная с поколения 6S / 6S +, у iOS была проблема с floatVertexTextures. Исправление, которое мы использовали, - отключить эту функцию на iOS. Это ограничивает кости, которые мы можем использовать, но мы все равно должны ограничивать их, чтобы поддерживать более дрянные телефоны.

Поскольку устройства iOS не проходят тест на соответствие, опубликованный

@ daniel-nth Думаю, это имеет смысл. Однако ... @OrtOfOn говорил, что z = 60K воспроизводит проблему на рабочем столе ... У меня нет проблем с 60K на рабочем столе, только 1e8 было достаточно для меня, чтобы "воспроизвести". Так что, возможно, это действительно как минимум 3 отдельные проблемы:

  • текстуры float на ios,
  • что-то размером 60К на @OrtOfOn ,
  • потеря точности на 1e8 из-за неправильного порядка умножения матрицы в бите шейдера костей (тот, который я испортил выше),
  • может быть, что-то еще в вершинном шейдере, так как девушка после патча все еще немного шаталась.

Привет, ребята,
Во-первых, спасибо, что вернулись к этой ошибке. Я так и не нашел времени покопаться в нем :(

@ daniel-nth Масштаб объекта влияет на ошибку:

В iOS с этим очень огромным объектом «Лара» (высота = 120, масштаб = 1) ошибка действительно появляется на z = 60000. Но, если вы возьмете сетку реалистичного размера (высота = 1,8, масштаб = 1), она появится уже только при z = 100.

чем больше skinnedmesh, тем дальше должен быть перевод, чтобы увидеть ошибку.

Как уже было проверено и сообщалось в этом потоке, отключение floatTextures в iOS приводит к отсутствию скиннинга вообще.

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

В iOS с этим очень огромным объектом "Лара" (высота = 120, масштаб = 1) ошибка появляется на z = 60000.

@OrtOfOn подожди, так на ios? но вы также сказали:

число, на котором вы сосредоточились (60000), используется только для выявления ошибки на рабочем столе (с этим очень огромным образцом lara или огромным образцом threejs fbx) ... не на мобильных устройствах.

В iOS с этим очень огромным объектом «Лара» (высота = 120, масштаб = 1) ошибка действительно появляется на z = 60000.

Это совсем не так уж и много.
И вы все еще не понимаете взаимосвязи между размером модели и мировым масштабом.
В последнее время:
http://necromanthus.com/Test/html5/Lara_1000000.html
Примерная высота модели = 75 и мировой масштаб = 9 999 999.
От Z = 0 до Z = 1,000,000 (один миллион !!!)
Поскольку число цифр с плавающей запятой одинарной точности равно 7, десятичных знаков не осталось !!!
Он отлично работает на всех моих ноутбуках и настольных компьютерах.
Даже больше:
он отлично работает на Android 6 и 7 и различных мобильных телефонах Samsung.

lara_1000000

@RemusMar в вашем примере введите это в консоль:

camera.position.z += 1e8;
scene.children[2].position.z += 1e8;

вы увидите что-то вроде этого:
screen shot 2018-03-03 at 15 48 53

screen shot 2018-03-03 at 15 51 41
это странно

Я вам скажу, что z = 1e6 тоже неплохо. вокруг 1e7 это уже заметно, а 1e8 просто безумие

@OrtOfOn Установка для

Я вам скажу, что z = 1e6 тоже неплохо. вокруг 1e7 это уже заметно, а 1e8 просто безумие

Я знаю, но для этих значений у вас неточность.
Для точности веса вершин скелетной сетки максимальный мировой размер равен 9.999.999
Это означает максимальные расстояния в несколько миллионов, не более.
ура

@makc Действительно, я ошибся цифрами для рабочего стола. Он должен быть очень большим, вы правы, и я уже упоминал в теме ранее: / https://github.com/mrdoob/three.js/issues/13288#issuecomment -364650679

@ daniel-nth Полезно знать, но вы уверены? Вот тест, который я сделал здесь, в этой теме, с 3d-моделью из источников threejs. Вы все еще можете посмотреть на код. @ Mugen87 тоже https://github.com/mrdoob/three.js/issues/13288#issuecomment -364572653

О, я вижу, модели больше нет. 404 на https://threejs.org/examples/models/fbx/xsi_man_skinning.fbx

@ daniel-nth Если вы используете новую модель с меньшим количеством костей, то я вам верю;)

@RemusMar Совершенно согласен с вами относительно расстояний, упоминаемых в последних сообщениях. Числа (1e6, 1e8, 1e9, ...), безусловно, будут иметь плохую точность. Никаких сомнений насчет этого. Но, пожалуйста, перестань меня троллить. Прекратите притворяться, что я ничего не понимаю, и спросите себя, не является ли меш аватара высотой 120 огромным. На мой взгляд, он очень огромен и не очень удобен для разработки игр с другими реалистичными масштабируемыми объектами, созданными художниками, создателями лучей, физикой, освещением ... и будет доставлен через 3 недели.

Я настаиваю: поддержание реалистичного масштаба активов с метрическими единицами измерения является обязательным условием для правильного построения физической игры :)

Жаль, что на iOS я не могу запустить свой аватар более 100 м в этих реалистичных условиях масштабирования: /

ОБНОВЛЕНИЕ: В любом случае, @ daniel-nth, похоже, сообщает нам, что теперь он работает с отключенными floatTexture и очень ограниченным количеством костей.

Но, пожалуйста, перестань меня троллить
Я настаиваю: поддержание реалистичного масштаба активов с метрическими единицами измерения является обязательным условием для правильного построения физической игры :)

Я тебя не троллю.
Но 1,5 единицы не означают 1,5 метра
ура

@OrtOfOn

Я настаиваю: поддержание реалистичного масштаба активов с метрическими единицами измерения является обязательным условием для правильного построения физической игры :)

но эта шкала - некое произвольное значение. вы могли бы точно так же решить использовать сантиметры, и тогда «сетка аватара высотой 120» на самом деле будет меньше среднего.

@makc Конечно, но физический движок / библиотеки ожидают, что вы будете использовать значения метрик. Вы уже пробовали заниматься физикой на масштабированных объектах или с неметрическими значениями? Быстро развиваться становится ужасно, и получаются неожиданные и нереальные результаты. Все ваши силы тоже должны быть пересмотрены и масштабированы. Будет работать, но не точно.

Конечно, это зависит от требуемого уровня точности, а такие значения, как 1e6, 1e7, ... слишком велики и будут вызывать проблемы с точностью. И вам никогда не придется перемещать сетку со скином так далеко. Мы договорились об этом. Но в iOS мы должны иметь возможность перемещать сетку с графическим процессором (высотой 1,5 единицы) как минимум на несколько сотен единиц.

но физический движок / библиотеки ожидают, что вы будете использовать значения метрик.

Это не правда.
Метры, сантиметры, дюймы и т. Д. Не имеют значения.
Как я уже говорил (несколько раз) ранее, все, что имеет значение, - это размер мира (масштаб) и точность.
Помните следующее:
если у вас есть скелетный меш с высотой = 1,5 единицы, карта весов вершин вынуждает вас использовать как минимум 2-3 десятичных знака.
Для физического движка (если есть) вам может потребоваться 3-4 десятичных знака для приемлемых результатов.
Если для глобальной точности требуется 4 десятичных знака, ваш максимальный мировой размер равен 999 (поскольку число цифр с плавающей запятой одинарной точности равно 7).
Другими словами, вы можете использовать расстояния в несколько сотен, если хотите приличную анимацию и приличную физику.
Надеюсь, на этот раз вы получили полную картину.
ура

@RemusMar Я остановлюсь здесь. Похоже, вы не хотели или не хотите тестировать свой случай на устройстве iOS. Вы не можете использовать «расстояние в несколько сотен» на этих устройствах со скинами графического процессора. Сетка очень быстро сходит с ума. В этом суть этой темы, и я просто хотел сообщить об этом в начале. Итак, это все.

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

Вы не можете использовать «расстояние в несколько сотен» на этих устройствах со скинами графического процессора.

Вы снова ошибаетесь.
См. Снимок экрана выше (Android 7 - мобильный телефон Samsung).
Высота модели = 75 (радиус ограничивающей сферы около 38) и расстояние 1000000 (один миллион !!!)
Или высота модели = 1,5 и расстояние 20000.

пс
Не моя проблема, что iOS всегда была кучей ошибок.

@RemusMar Я не ошибаюсь, тролль. Я говорю об iOS, а ты о другом устройстве ... ты что, злишься ??

Не моя проблема, если вы так сильно ненавидите Apple. Когда один из моих клиентов хочет, чтобы трехмерная веб-игра была сделана с помощью ThreeJS, я не говорю ему «пошли на хуй свои айфоны» ... Если вы это сделаете, мне вас жаль.

Конец передачи здесь ... Я больше не могу следить за этим.

@OrtOfOn Да, у модели, которую я использовал, 19 костей, у 404 fbx - 67.

https://github.com/mrdoob/three.js/issues/13288#issuecomment -364550036 содержал ссылку на страницу, которая показывает единый предел кости. Формула, которую использует эта страница: Math.floor((data.webgl.params.MAX_VERTEX_UNIFORM_VECTORS - 20) / 4); Не уверен, что она на 100% точна для three.js, но она сообщает 27 даже на iPhone X, что, к сожалению, меньше половины даже Galaxy S3, но все же достаточно для мобильная игра WebGL. Я быстро просмотрел свою рабочую папку, и в 26 проектах WebGL только в одном есть модель с большим количеством костей, и эта модель остается на 0,0,0.

@OrtOfOn : У меня похожие проблемы с фиксированной сценой и перемещением персонажа со

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

Я отправлю ответ, когда у меня будет решение.

Просто к сведению, текстуры с плавающей запятой на iOS ломаются не только вершинными шейдерами. Недавно я менял текстуры с плавающей запятой на целочисленные, чтобы исправить цветовую полосу на ios, так что это универсальная проблема для ios. вы, вероятно, могли бы использовать целочисленные текстуры для исправления костей на ios, если действительно хотите - вот соответствующий фрагмент из чужого шейдера:

vec2 encodeFloatRG( float v )
{
    vec2 kEncodeMul = vec2(1.0, 255.0);
    float kEncodeBit = 1.0/255.0;
    vec2 enc = kEncodeMul * v;
    enc = fract (enc);
    enc.x -= enc.y * kEncodeBit;
    return enc;
}

float decodeRGFloat( vec2 enc )
{
    vec2 kDecodeDot = vec2(1.0, 1.0/255.0);
    return dot( enc, kDecodeDot );
}

... на самом деле, вы, вероятно, могли бы (я предполагаю, что на самом деле не пробовал что-то подобное) заставить работать текстуры плавающих костей, если вы принимаете точность ios как глобальный предел точности и сохраняете два числа с плавающей запятой в текстуре вместо одного

Я решил проблему полностью, попросив threejs выполнить вычисление скинов в локальном пространстве - там, где оно принадлежит - и преобразовать модель в координаты реального мира стандартным способом через матрицу мирового пространства.

Вышеупомянутые проблемы полностью исправлены для скинов на iOS. Я также должен отметить, что это решение универсально - безупречно работает во всех настольных браузерах, а также на протестированных мной устройствах Android. IMHO скиннинг локального пространства - правильный путь почти во всех случаях, и этот метод должен быть по умолчанию для ThreeJS. @mrdoob : что ты

mesh = new THREE.SkinnedMesh(geo.geometry, mat);
mesh.bindMode = 'detached';
var skel = new THREE.Skeleton(bones, boneInvs);
var bsm = new THREE.Matrix4().fromArray(geoPrims.bsm);
mesh.bind(skel, bsm);

// make bsmInv identity for models that have multiple skins
mesh.bindMatrixInverse = new THREE.Matrix4();

// patch SkinnedMesh's updateMtxWorld:
// we're using local skinning, so don't keep resetting binMatrixInverse (leave identity)
// the reason we're using .bind here is for models that have more than one skin
mesh.updateMatrixWorld = PatchSkinnedMeshUpdateMW.bind(mesh);

// re-normalize since input data has been compressed
mesh.normalizeSkinWeights();

// remove bone roots and add to bone root list
for (var bi = 0, bl = bones.length ; bi < bl ; bi++) {
    if (bones[bi].parent && !bones[bi].parent.isBone) {
        bones[bi].parent.remove(bones[bi]);
        boneRoots.push(bones[bi]);
    }
}

Где 'boneRoots' должен быть добавлен к корневому объекту сцены (чтобы они получали обновления матрицы, но не наследовали все матрицы в иерархии, ведущей к фактическому скиновому мешу). Добавьте эти boneRoots в корень сцены (код не показан).

А вот патч для замены реализации SkinnedMesh threeJS (обратите внимание, что это необходимо только потому, что updatematrixworld threejs затирает bindMatrixInverse, который мы хотим сохранить как личность). Кроме того, вы можете выполнить привязку к THREE.Mesh..prototype.UpdateMatrixWorld напрямую вместо использования функции исправления.

function PatchSkinnedMeshUpdateMW( force ) {
    THREE.Mesh.prototype.updateMatrixWorld.call( this, force );
}

@ denbo-ft Мне кажется, это звучит неплохо. Хотите создать для него пиар?

@ denbo-ft Большое спасибо за ваши усилия. Извините за поздний ответ, я больше не слежу за этой веткой.

у нас также есть эта проблема в нашем продукте - в любом браузере (если вы уйдете достаточно далеко от 0,0,0), но более заметна на iOS, поскольку это происходит, когда вы находитесь примерно на расстоянии 2-3 единиц. Критично для нас, но, по крайней мере, мы посмеемся, когда увидим это
image

Ладно, похоже, это нужно другим людям. Я никогда не участвовал в проектах с открытым исходным кодом на github, но я знаком с git и постараюсь создать пиар. :)

Тоже самое. My SkinnedMesh выглядит как эпизод с доктором Кацем, профессиональным терапевтом на iPhone.

К вашему сведению, в моем сообщении от 21 мая есть полное решение. Не так много исправлений для исходников ThreeJS - большая часть исправлений относится к вашему загрузчику и / или коду настройки сцены для ваших индивидуальных проектов.

Основное исправление - использовать режим «отсоединенный» (который, кстати, недокументирован) и разместить иерархию костей в вашей сцене на корневом уровне сцены, а не на месте с фактической иерархией визуализируемых персонажей. Затем исправьте одну простую вещь из движка (SkinnedMesh.update), и все будет хорошо.

Редактировать:
У нас есть полностью настраиваемый формат файла и загрузчик для TJS, поэтому, к сожалению, для создания полного PR с примером решения мне пришлось бы исправить один из поставляемых стандартных загрузчиков (например, Collada). Я займусь этим сейчас

спасибо, я собирался выделить время, чтобы попытаться понять, а также применить ваше решение более общим способом (ваше решение казалось немного специфичным для вашего проекта). Не могли бы вы рассказать немного больше о контексте вашего кода?

Доктор Кац, профессиональный терапевт

Я не на крючке или что-то в этом роде, но блин

РЕДАКТИРОВАТЬ:

Я успешно создал запрос на перенос - дайте мне знать, если я могу что-то еще сделать.

Исходный пост:

У меня есть локальная ветка с изменениями, но я не могу нажать на источник. Даже предоставив свои кредиты на github, я получаю эту ошибку:

Нажимаем на https://github.com/mrdoob/three.js.git
удаленный: доступ к mrdoob / three.js.git запрещен для denbo-ft.
фатальный: невозможно получить доступ к https://github.com/mrdoob/three.js.git/ : запрошенный URL-адрес вернул ошибку: 403

Хотел бы получить совет, так как это мой первый вклад в github. благодаря!

К вашему сведению, если PR работает для mrdoob и интегрирован, существует новый режим привязки "local", который поддерживает это изменение. Я не хотел патчить или изменять недокументированный режим «отсоединенного» связывания, поскольку нет никаких указаний на то, кто или что его использует, и я не хотел нарушать то, о чем я не знал. Но мне действительно кажется, что это могло быть предназначено для этой цели.

Все, что делает binMode = "local", не меняет bindMatrixInverse во время обновления, в отличие от "detached", которое сбрасывает его до значения, обратного bindMatrix, вместо того, чтобы оставить идентификатор.

См. Пример webgl_loader_collada_skinning.html в этом PR, чтобы увидеть несколько изменений, необходимых на уровне сцены, чтобы получить надлежащую локальную скиннинг для персонажей, которые перемещаются по сцене.

Демонстрационная версия загрузчика DAE штурмовика использовалась для проверки этого исправления. Для этих тестов персонаж был перемещен на 2000 единиц от источника. Скриншоты ниже.

Ниже представлены снимки с iPhone X / Safari 11.

До этого изменения (в 2000,2000,2000):
img_0658

После этого изменения:
img_0659

Как вы думаете, есть ли способ добиться этого, не имея костей на уровне корневой сцены и (0,0,0)? Я использую кости, чтобы прикрепить что-то к аватару, заставить его смотреть на точки и т. Д. И т. Д. И я думаю, что я не единственный

У вас есть два варианта:

1) Держите кости в мировом пространстве в корне, чтобы получить выгоду от локального скиннинга, как это реализовано в threejs. Затем выполните дополнительные преобразования, если вам абсолютно необходимо прикрепить оружие к кости, например, чтобы поместить его в пространство аватара.

2) Оставьте Bones в пространстве аватара как есть и получите деформацию на ios.

Я бы определенно сделал №1. Вы всегда можете вычислить, где должен быть прикрепляемый объект в любом заданном кадре, когда у вас уже есть позиция кости и позиция персонажа. Но для №2 нет обходного пути, потому что деформация вызвана упаковкой на уровне HAL устройств iOS, и вы ничего не можете с этим поделать. Конечно, вы можете добавить дополнительные хаки, пытаясь использовать различные упаковки HalfWord и т. Д., Описанные выше, но все они уменьшают проблему, а не устраняют ее. Проблема со скиннингом на ios полностью исчезнет, ​​если вы сделаете скиннинг в локальном пространстве (точнее, держите кости по центру происхождения мира, чтобы числа были как можно меньше). Затем xform в пространство символов для вложений.

Больше информации:

Проблема с тем, как это реализовано в TJS, не связана конкретно с TJS, но для решения проблемы ограничения костей из-за ограниченного количества униформ на программу шейдера используются BoneTexture. Это довольно стандартное решение. Однако в iOS числа с плавающей запятой в текстурах квантуются - упаковываются / сжимаются - до чего-то меньшего, чем 32 бита. Это вызывает «богомола» или другие дурацкие эффекты персонажей, когда размер / величина числа «большой», то есть более нескольких сотен.

Хорошо, отлично, что нам теперь делать? Ну, каждая важная функция вашей игры (на самом деле игровой движок) обычно требует Стандартов практики. Пример: попросите художников сосредоточить персонажа на происхождении. Поместите корневой узел персонажа на ноги / землю, определенным образом создайте кости и кожу. Затем напишите экспортера (или импортера в случае TJS) и импортера, которые знают о ваших правилах процесса. Затем поддержите последнюю функцию в движке при загрузке ресурсов с этой конфигурацией. Так мы поступаем в игровой индустрии.

Неуправляемо и неопределенно (и то и другое ужасно для разработки игр) ожидать, что ЛЮБОЙ метод создания, ЛЮБОЙ формат файла и ЛЮБОЙ общий загрузчик отлично справятся со всеми функциями вашей игры. На этом пути должны быть какие-то стандарты и процессы.

Если ваш персонаж использует скиннинг и ему также нужно прикрепить гео для оружия или чего-то еще, подумайте о том, что вообще требуется для двигателя, а затем поработайте с этим. В качестве примера я привел одно такое решение. К сожалению, ПР не приняли, потому что почему-то не хотят менять грузчиков. в любом случае, я надеюсь, что я объяснил проблему и решение в ветке выше, а также PR, который я отправил.

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

Удачи!

Проблема со скином на ios полностью исчезнет, ​​если вы будете снимать скин в локальном пространстве.

Как я сказал с самого начала, это обходной путь для ограничения (ошибки) iOS, и для этого вам придется тратить вычислительную мощность.
Это не выход!
Реальное решение - повысить точность с плавающей запятой на iOS (до нормального значения 7 цифр).
http://davenewson.com/posts/2013/unity-coordinates-and-scales.html

@ denbo-ft Я действительно реализовал ваш PR (у нас есть собственный загрузчик), поэтому спасибо за ваш вклад, он был оценен. Я надеялся на другой подход, поскольку у нас есть несколько аватаров в наших сценах, они перемещаются, захватывают предметы, взаимодействуют друг с другом и т. Д., И наличие скелета в 0,0,0 заставит нас изменить много вещей в наших код, рискуя получить новые проблемы и т. д.

Я долго размышлял над проблемой, но лучшего решения не нашел. (Все еще пытаюсь)

@RemusMar

Реальное решение - повысить точность вычислений с плавающей запятой на iOS.

может быть, кто-то должен сначала спросить

Такое ощущение, что это не просто баг, а яблочное «решение» какой-то другой проблемы

Наверное, правда.
Аналогично проблеме в Firefox Android: сообщена ошибка, подтверждена разработчиком, но не исправлена ​​за последние 5 месяцев (2 выпуска)!?!

Вот как работает разработка программного обеспечения в наши дни:
вместо исправлений в нужном месте есть обходные пути у сторонних разработчиков.
Конечный результат: коллекция ошибок, потраченных впустую ресурсов и вредоносного ПО !!!

@jfcampos
Я бы рекомендовал сохранить иерархию костей в корне и просто добавить функцию для захвата конечной позиции WS любой кости, умножив ее на martixWorld матрицы фактического местоположения аватара. Это очень просто и вернет вам то, что у вас было до исправления.

В качестве альтернативы, если у вас есть отбивные, вы можете вернуться к исходному методу (с ошибкой), включить локальные матрицы в текстуру кости, удвоив ее использование текстуры, а затем изменить фрагменты шейдера, чтобы выполнять дополнительные вычисления на графическом процессоре во время создания скинов. . Имейте в виду, что это решение, хотя и «более чистое» с точки зрения кода, удваивает (возможно, в четыре раза) количество текстуры, загружаемой в графический процессор каждый кадр, и, следовательно, намного менее эффективно, чем предложенное выше. Но по каким бы то ни было причинам, о которых я не знаю, для вас может быть выгоднее сделать это вторым способом.

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

Похоже, мне придется пойти с костями на 0,0,0 и сделать несколько дополнительных вычислений матрицы для других вещей. Благодаря!

@ denbo-ft верен. Это проблема three.js, вызванная снятием скинов в мировом пространстве.

Для справки, здесь было внесено изменение в скиннинг мирового пространства: https://github.com/mrdoob/three.js/pull/4812.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги