Есть в иходниках книги вот такой код ( глава 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, что за значения присваиваются элементам матрицы и зачем?
Изометрия чтоли?
ну чо-то типа того, если закоментировать строки matWorld._41 = (float)i * 80.0f - 80.0f; matWorld._42 = 0.0f; matWorld._43 = (float)j * 80.0f - 80.0f то тестура отображается на примитиве 1 раз, если оставить, то несколько раз и в разных местах. Но вот почему так?
UV координаты для трисов?
Ну по идее это x,y,z координыты
если оставить, то несколько раз и в разных местах. Но вот почему так?
ну дык в цикле ж рисуешь :) сщ сменой координат
значит как я понял задаем матрице мира новую систему координат и в этих новых координатах рисуется примитив на который накладуется текстура. Но вот зачем мировой матрице matWorld присваивать значение матрицы вида matView и делать транспонирование координат: D3DXMatrixTranspose(&matWorld, &matView) ?
www.steps3d.narod.ru - почитай основы 3д графики/аналитической геометрии
Вроде разобрался, непонял только зачем нужно D3DXMatrixTranspose(&matWorld, &matView). Если эту строку убрать то примитивы не рисуются.
Наверно, чтобы рисовались...
Подозреваю, что они рисуются, просто ты их не видишь.
yansn
Billboard - это объект, который рисуется всегда "лицом" к наблюдателю. Поэтому мы юзаем матрицу вида (в частности повороты). На Pos записываем свои координаты.
Я уже не раз говорил, не читайте Адамса, себе дороже. Ужасный код, ошибки, бредовые методы и т.д.
Kroll
> Я уже не раз говорил, не читайте Адамса, себе дороже. Ужасный код, ошибки,
> бредовые методы и т.д.
А кого читать?
vkd
> Я уже не раз говорил, не читайте Адамса, себе дороже. Ужасный код, ошибки,
> бредовые методы и т.д.
Не знаю, у меня все нормально компилилось, да и код нормальный.
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;
кординаты центра билборда
Тема в архиве.