Как генерировать нормы вершины из буфера атрибута GLTF Positions?Javascript

Форум по Javascript
Ответить
Anonymous
 Как генерировать нормы вершины из буфера атрибута GLTF Positions?

Сообщение Anonymous »

Я пытаюсь реализовать нормальную генерацию вершины из положений вершины, используя метод перекрестного продукта (в JavaScript, из буфера позиций GLTF), но большинство полученных нормеров оказываются (0, 0, 0). Код: < /p>

Код: Выделить всё

        const vertices = new Float32Array(
positionsBuffer,
meshData.positions.byteOffset,
meshData.positions.byteLength
)

const indices =
new Uint16Array(
indexBuffer,
meshData.indices.byteOffset,
meshData.indices.byteLength
)

const normals = new Float32Array(vertices.length)

for (let i = 0; i < indices.length; i += 9) {
const vert0 = vec3.create(
vertices[indices[i]],
vertices[indices[i + 1]],
vertices[indices[i + 2]]
)
const vert1 = vec3.create(
vertices[indices[i + 3]],
vertices[indices[i + 4]],
vertices[indices[i + 5]]
)

const vert2 = vec3.create(
vertices[indices[i + 6]],
vertices[indices[i + 7]],
vertices[indices[i + 8]]
)

// p = cross(B-A, C-A)
const normal = vec3.normalize(
vec3.cross(
vec3.subtract(vert1, vert0),
vec3.subtract(vert2, vert0)
)
)

normals[indices[i]] += normal[0]
normals[indices[i + 1]] += normal[1]
normals[indices[i + 2]] += normal[2]

normals[indices[i + 3]] += normal[0]
normals[indices[i + 4]] += normal[1]
normals[indices[i + 5]] += normal[2]

normals[indices[i + 6]] += normal[0]
normals[indices[i + 7]] += normal[1]
normals[indices[i + 8]] += normal[2]
}

for (let i = 0; i < indices.length; i += 3) {
const normalizedNormal = vec3.normalize(
vec3.create(
normals[indices[i]],
normals[indices[i + 1]],
normals[indices[i + 2]]
)
)

normals[indices[i]] = normalizedNormal[0]
normals[indices[i + 1]] = normalizedNormal[1]
normals[indices[i + 2]] = normalizedNormal[2]
}
< /code>
То, что я ожидал получить, - это нечто похожее на это изображение, но я на самом деле получаю это < /p>
Я попытался изменить порядок извилистого, на Нет эффекта. Нормализация или нет, кажется, не имеет никакого значения (но это связано с тем, что нормализации нормализации в шейдере в любом случае).
Из того, что я видел в Интернете, математика, кажется, в порядке.
i ' M также довольно уверен, что все вершины обрабатываются, потому что касательные, которые я генерирую таким же образом, оказалось просто отлично. Для меня это означает, что нормали [индексы [i]] += нормальный [0] 
регулярно производят 0, но я не могу понять, почему. И что с этим делать, если это проблема. Любые предложения были бы очень оценены. Модель генерируется с помощью khronos blender gltf 2.0 exporter


Подробнее здесь: https://stackoverflow.com/questions/794 ... ute-buffer
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»