Применение преобразования к модели без рендеринга - PullRequest
0 голосов
/ 10 октября 2011

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

Это моя первая попытка:

foreach (ModelBone b in model.Bones)
{
   // apply the model transforms and the worldMatrix transforms to the bone
   b.Transform = model.Root.Transform * worldMatrix;
}

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

Есть ли какой-то другой способ, которым я должен пытаться трансформировать модель?

1 Ответ

1 голос
/ 10 октября 2011

b.Transform = root * world;не учитывает никаких данных в самой кости.

, возможно, вам нужно: b.Transform = root * b * world;

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

Как правило, это будет выглядеть примерно так:

//class scope fields
Matrix[] modelTransforms;
Matrix worldMatrix;

//in the loadContent method just after loading the model
modelTransforms - new Matrix[model.Bones.Count];
model.CopyAbsoluteTransformsTo(modelTransforms);//this line does what your foreach does but will work on multitiered hierarchy systems

//in the Update methos
worldMatrix = Matrix.CreateScale(scale);
boundingBox.Min *= scale;
boundingBox.Max *= scale
//raycast against the boundingBox here

//in the draw call
eff.World = modelTransforms[mesh.ParentBone.Index] * worldMatrix;
...