BufferGeometry всегда создает нормали FlatShading. Мне нужен SmoothShading

Я использую ThreeJS r68.

Я всегда использовал THREE.Geometry для своего проекта, и он отлично работает. Теперь я хочу изменить с THREE.Geometry на THREE.BufferGeometry, потому что я читал, что это лучший выбор. Но я не смог заставить SmoothShading работать с моим THREE.BufferGeometry.

Я загружаю свой объект в BufferGeometry и вызываю bufferGeometry.computerVertexNormals. И тогда мой результат — FlatShading.

Я прочитал в методе computeVertexNormals(), что BufferGeometry вычисляет по-разному, если я использую атрибут "index". Я попытался создать «индексированную» BufferGeometry, но это только ухудшило ситуацию. Я не знаю, если я только что создал это право. Я просто добавил индексы, как если бы я добавлял их к граням в обычной геометрии. Метод BufferGeometry.fromGeometry() не создает индексированную BufferGeometry, поэтому я не знаю, где искать.

Нужна ли мне индексированная BufferGeometry для SmoothShading?

ОБНОВИТЬ

[... немного позже....]

Думаю, теперь я мог бы создать индексированный THREE.BufferGeometry. Это больше похоже на геометрию. А гладкое затенение отлично смотрится с индексированной BufferGeometry. Итак, теперь у меня есть SmoothShading, но недействительная uv-карта. Но почему uv-карта в индексированной BufferGeometry отличается от неиндексированной BufferGeometry? BufferGeometry действительно не так легко загружается.


person Benedikt    schedule 16.09.2014    source источник


Ответы (2)


OK.

Вот что я получил:

1.) SmoothShading работает только для индексированных THREE.BufferGeometry. (насколько я знаю) И не для неиндексированной BufferGeometry.

2.) Индексированный THREE.BufferGeometry имеет только 1 точку uv на вершину, а не 1 точку uv на вершину грани.
Это означает, что если у вас есть квадрат с 4 точками, то у вас есть только 4 точки uv, а не 6, как в THREE.Geometry и неиндексированные THREE.BufferGeometry. (Это сбивает с толку и не позволяет использовать сложные UV-карты)

ОБНОВИТЬ

[...через несколько часов сна...]

Я снова заглянул в THREE.BufferGeometry.computerVertexNormals(). И я должен исправить себя.

проиндексировано THREE.BufferGeometry:

1) только 1 uv на вершину
2) только 1 нормаль на вершину
результат :
- возможен только smoothShading.
- только простые uv карты.
- ограничение в 65 535 вершин.

не индексируется THREE.BufferGeometry:

1) 1 uv на вершину грани
2) 1 нормаль на вершину грани
результат:
- вычисление нормалей в ThreeJS(r68): только FlatShading
- вычисление нормалей вне ThreeJS и импорт нормалей: FlatShading и SmoothShading
- возможны сложные UV-карты

person Benedikt    schedule 16.09.2014
comment
Привет. Не могли бы вы сказать, если вы думаете, что это связано с моим вопросом ? - person jeum; 02.07.2016

Вы можете применить THREE.FlatShading к своему материалу, чтобы получить плоский затененный индекс THREE.BufferGeometry. В этом случае вам вообще не нужно определять какие-либо нормали.

Это сэкономит вам много головной боли и накладных расходов:

geometry = new THREE.BufferGeometry

material = new THREE.MeshPhongMaterial({ 
    color: 0xff0000, 
    shading: THREE.FlatShading
});

mesh = new THREE.Mesh( geometry, material );

Ваша сетка будет отображаться плоской затененной. Это пока не работает для THREE.MeshLambertMaterial. Но они работают над этим. Проверьте связанную проблему здесь, на GitHUB.

person Wilt    schedule 04.02.2016