Преобразование сетки Direct3D - PullRequest
2 голосов
/ 01 декабря 2008

Я пытался написать функцию TransformMesh. Функция принимает объект Mesh и объект Matrix. Идея состоит в том, чтобы преобразовать сетку, используя матрицу. Для этого я заблокировал буфер вершин и вызвал Vector3 :: TransformCoordinate для каждой вершины Он не дал ожидаемые результаты. Получившаяся сетка была неузнаваема.

Что я делаю не так?

// C++/CLI code. My apologies.
int n = verts->Length;
for(int i = 0; i < n; i++){
        verts[i].Position = DX::Vector3::TransformCoordinate(verts[i].Position, matrix);
}

Ответы [ 3 ]

2 голосов
/ 04 февраля 2009

Без контекстного кода вокруг того, что вы делаете, может быть трудно узнать точную проблему. Как создается сетка? Как читается verts [], как пишется? Вы пытаетесь читать из буфера вершин только для записи?

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

Как я уже сказал, потребуется больше кода, чтобы точно определить причину проблемы.

1 голос
/ 24 апреля 2009

Я полностью согласен с Coincoin, контекстный код поможет.
И если вы хотите просто нарисовать трансформированную сетку на экране, вам не нужно трансформировать сетку таким образом. Вы можете просто изменить одну из матриц мира, вида и проекции. Это дает ожидаемый результат. Как в следующем примере кода.

      // Clear the backbuffer to a Blue color.
  device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Blue,   
     1.0f, 0);

  // Begin the scene.
  device.BeginScene();

  device.Lights[0].Enabled = true;

  // Setup the world, view, and projection matrices.
  Matrix m = new Matrix();

  if( destination.Y != 0 )
     y += DXUtil.Timer(DirectXTimer.GetElapsedTime) * (destination.Y 
          * 25);

  if( destination.X != 0 )
     x += DXUtil.Timer(DirectXTimer.GetElapsedTime) * (destination.X 
          * 25);

  m = Matrix.RotationY(y);
  m *= Matrix.RotationX(x);

  device.Transform.World = m;
  device.Transform.View = Matrix.LookAtLH(
      new Vector3( 0.0f, 3.0f,-5.0f ),
      new Vector3( 0.0f, 0.0f, 0.0f ),
      new Vector3( 0.0f, 1.0f, 0.0f ) );   
  device.Transform.Projection = Matrix.PerspectiveFovLH(
      (float)Math.PI / 4, 1.0f, 1.0f, 100.0f );

  // Render the teapot.
  teapot.DrawSubset(0);

  // End the scene.
  device.EndScene();

Этот образец взят из здесь .

0 голосов
/ 11 сентября 2010

Рекомендую использовать функцию D3DXConcatenateMeshes. Пройдите одну сетку и одну матрицу. Результатом будет трансформированная сетка. Это довольно просто.

...