ПрограммированиеФорумГрафика

Джим Адамс Программирование ролевых игр

#0
11:47, 1 сен 2009

Есть в иходниках книги  вот такой код ( глава 2, billboard):
if(SUCCEEDED(g_pD3DDevice->BeginScene())) {
    // Draw the floor
    g_pD3DDevice->SetStreamSource(0, g_pFloorVB, 0, sizeof(s3DVertex));
    g_pD3DDevice->SetFVF(FVF3D);
    g_pD3DDevice->SetTexture(0, g_pFloorTexture);
    D3DXMatrixIdentity(&matWorld);
    g_pD3DDevice->SetTransform(D3DTS_WORLD, &matWorld);
    g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

    // Draw the billboards
    g_pD3DDevice->SetStreamSource(0, g_pBillboardVB, 0, sizeof(s3DVertex));
    g_pD3DDevice->SetTexture(0, g_pBillboardTexture);

    g_pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
    D3DXMatrixTranspose(&matWorld, &matView); //<--------------------------------------------------------- ?
    for(i=0;i<3;i++) {
      for(j=0;j<3;j++) {
        matWorld._41 = (float)i *  80.0f - 80.0f; //<--------------------------------------------------------- ?
        matWorld._42 = 0.0f;                            //<--------------------------------------------------------- ?
        matWorld._43 = (float)j *  80.0f - 80.0f;//<--------------------------------------------------------- ?

        g_pD3DDevice->SetTransform(D3DTS_WORLD, &matWorld);
        g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
      }
    }
Не понятны манипуляции с матрицей matWorld, что за значения присваиваются элементам матрицы и зачем?

#1
12:40, 1 сен 2009

Изометрия чтоли?

#2
13:59, 1 сен 2009

ну чо-то типа того, если закоментировать строки  matWorld._41 = (float)i *  80.0f - 80.0f; matWorld._42 = 0.0f; matWorld._43 = (float)j *  80.0f - 80.0f то тестура отображается на примитиве 1 раз, если оставить, то несколько раз и в разных местах. Но вот почему так?

#3
15:27, 1 сен 2009

UV координаты для трисов?

#4
15:37, 1 сен 2009

Ну по идее это x,y,z координыты

#5
15:58, 1 сен 2009

если оставить, то несколько раз и в разных местах. Но вот почему так?
ну дык в цикле ж рисуешь :) сщ сменой координат

#6
16:20, 1 сен 2009

значит как я понял задаем матрице мира новую систему координат и в этих новых координатах рисуется примитив на который накладуется текстура. Но вот зачем мировой матрице matWorld присваивать значение матрицы вида matView и делать транспонирование координат:  D3DXMatrixTranspose(&matWorld, &matView) ?

#7
16:22, 1 сен 2009

www.steps3d.narod.ru - почитай основы 3д графики/аналитической геометрии

#8
14:39, 2 сен 2009

Вроде разобрался, непонял только зачем нужно D3DXMatrixTranspose(&matWorld, &matView). Если эту строку убрать то примитивы не рисуются.

#9
15:04, 2 сен 2009

Наверно, чтобы рисовались...

Подозреваю, что они рисуются, просто ты их не видишь.

#10
16:39, 2 сен 2009

yansn
Billboard - это объект, который рисуется всегда "лицом" к наблюдателю. Поэтому мы юзаем матрицу вида (в частности повороты). На Pos записываем свои координаты.

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

Прошло более 9 месяцев
#11
16:43, 31 мая 2010

Kroll
> Я уже не раз говорил, не читайте Адамса, себе дороже. Ужасный код, ошибки,
> бредовые методы и т.д.

А кого читать?

#12
16:32, 7 июня 2010

vkd
> Я уже не раз говорил, не читайте Адамса, себе дороже. Ужасный код, ошибки,
> бредовые методы и т.д.

Не знаю, у меня все нормально компилилось, да и код нормальный.

#13
16:42, 7 июня 2010

Kroll
+1

yansn
> то тестура отображается на примитиве 1 раз
не один раз а несколько но в одном месте.

yansn
> D3DXMatrixTranspose(&matWorld, &matView);
после этого кода в matWorld хранится матрица поворота, которая орентирует плоскость бил борда перпендекулярно взгляду камеры

yansn
> matWorld._41 = (float)i * 80.0f - 80.0f;
> matWorld._42 = 0.0f;
> matWorld._43 = (float)j * 80.0f - 80.0f;
кординаты центра билборда

ПрограммированиеФорумГрафика

Тема в архиве.