Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / billboard - как сориентировать на камеру?

billboard - как сориентировать на камеру?

Поделиться

Страницы: 1 2 3 4 Следующая

progmanПостоялецwww12 мар. 20079:58#0
курил маны про billboard.
понял что это полигон, который пожизни ориентирован перпендикулярно вектору направления камеры.
как математически это реализовать?
у меня есть
D3DXVECTOR3 vLook = ::Game()->Device()->Look(); //вектор "взгляда" камеры
D3DXMATRIX m_matWorld; // мировая матрица полигона (X Y Z) мировые координаты полигона
D3DXMATRIXTranslation( &matWorld, X, Y, Z);

а вот дальше как хз

ну и в конце применить надо:
d3d->SetTransform( D3DTS_WORLD , matWorld );

подскажите плиз на что умножать m_matWorld надо?

ScaimanПостоялецwww12 мар. 200710:22#1
NikopolМодераторwww12 мар. 200710:50#2
Произвольный объект развернуть носом в нужную точку умеешь ?
Дык в чём тогда проблема развернуть билборд носом в ту точку, где щаз камера находится ?
progmanПостоялецwww12 мар. 200710:58#3
Nikopol
>Произвольный объект развернуть носом в нужную точку умеешь ?
>Дык в чём тогда проблема развернуть билборд носом в ту точку, где щаз камера
>находится ?

D3DXMATRIXRotationX(&matWorld,vLook.x);
D3DXMATRIXRotationY(&matWorld,vLook.y);
D3DXMATRIXRotationZ(&matWorld,vLook.z);

пробовал - фигня выходит.

NikopolМодераторwww12 мар. 200711:17#4
1.
Я не использую d3dx-отстой.
Ибо он разжижает мозг, и заставляет таскать с собой егойную dll-ку.

2.
Ясен пень, у тебя "фигня выходит".
Второй параметр в D3DXMATRIXRotationX(а также -Y,-Z) - угол поворота, а не какие-то там компоненты вектора взгляда.

progmanПостоялецwww12 мар. 200711:39#5
Nikopol
если ты это имеешь ввиду:
D3DXMATRIXRotationX(&matWorld, -vLook.x);
D3DXMATRIXRotationY(&matWorld, -vLook.y);
D3DXMATRIXRotationZ(&matWorld, -vLook.z);

то тоже не катит.
блин, вот как угол для поворота расчитать зная вектор взгляда и положение объекта в пространстве.....

ScartПостоялецwww12 мар. 200711:40#6
progman
Юзай матрицу вида - там все что нужно для билборда.
ScartПостоялецwww12 мар. 200711:42#7
progman
Nikopol говорил, что нужно брать угол поворота, а не x,y,z вектора взгляда (судя по названию vLook - это не повороты).
AndreyПостоялецwww12 мар. 200711:44#8
progman
У меня работает так:
// получаем указатель на массив из 4 вершин
Vertex* v = particle.GetVertex();
        const Camera& camera = render->GetCamera();
        const Math3D::Vector3D &right = camera.GetRight();
        const Math3D::Vector3D &up = camera.GetUp();
        const Math3D::Vector3D &direction = camera.GetDirection();
        // левый верхний
        Math3D::Vector3D qv0 = -right * particle.Width + up * particle.Height;
        // правый верхний
        Math3D::Vector3D qv1 = right * particle.Width + up * particle.Height;
        // правый нижний
        Math3D::Vector3D qv2 = right * particle.Width - up * particle.Height;
        // левый нижний
        Math3D::Vector3D qv3 = -right * particle.Width - up * particle.Height;

        v[0].vertex = particle.position + qv0;
        v[1].vertex = particle.position + qv1;
        v[2].vertex = particle.position + qv2;
        v[3].vertex = particle.position + qv3;
position это середина биллбоарда.
viewizardПостоялецwww12 мар. 200711:49#9
// находим вектор камера-точка нашего билборда
VECTOR3D nnTmp;
nnTmp = Camera - Location;
nnTmp.Normalize();

// находим перпендикуляр к вектору nnTmp
VECTOR3D nnTmp2;
nnTmp2.x = 1.0f;
nnTmp2.y = 1.0f;
nnTmp2.z = -(nnTmp.x + nnTmp.y)/nnTmp.z;
nnTmp2.Normalize();

// находим перпендикуляр к векторам nnTmp и nnTmp2
// файтически - это a x b = ( aybz - byaz , azbx - bzax , axby - bxay );
VECTOR3D nnTmp3;
nnTmp3.x = nnTmp.y*nnTmp2.z - nnTmp2.y*nnTmp.z;
nnTmp3.y = nnTmp.z*nnTmp2.x - nnTmp2.z*nnTmp.x;
nnTmp3.z = nnTmp.x*nnTmp2.y - nnTmp2.x*nnTmp.y;
nnTmp3.Normalize();


// собственно находим точки билборда (относительные)
VECTOR3D tmpPoint1, tmpPoint2, tmpPoint3, tmpPoint4;

tmpPoint1 = nnTmp3^(Size);
tmpPoint3 = nnTmp3^(-Size);
tmpPoint2 = nnTmp2^(Size);
tmpPoint4 = nnTmp2^(-Size);


Далее учитываем положение билборда (точка Location) и полученные точки смещения tmpPoint1, tmpPoint2, tmpPoint3, tmpPoint4
т.е. получаем 4 точки в абсолютных координатах
Location+tmpPoint1
Location+tmpPoint2
Location+tmpPoint3
Location+tmpPoint4


А вообще, математика рулит...

progmanПостоялецwww12 мар. 200711:50#10
Andrey
const Math3D::Vector3D &right = camera.GetRight();
const Math3D::Vector3D &up = camera.GetUp();
это что такое?

просто у мну в камере всего 2 переменные.
положение камеры в мире и вектор взгляда.

Правка: 12 мар. 2007 11:52

AndreyПостоялецwww12 мар. 200711:59#11
progman
камера представлена 3 векторами Up,Dir,Right это ортонормированный базис по нему(и вектору Positiion) строится матрица камеры.
Up- вектор "верха" камеры;
Right- вектор направления камеры по X камеры;
все 3 вектора взаимно перпендикулярны, хот сами могут быть не перпендикулярны мировой системе координат.
>просто у мну в камере всего 2 переменные.
>положение камеры в мире и вектор взгляда.
их можно вроде вытянуть из матрицы.
NomadПостоялецwww12 мар. 200712:40#12
progman
up = 0 1 0, обычно (поверни его, если камера вращается извращенно)
right = взгляд кросс up =)
NikopolМодераторwww12 мар. 200713:36#13
progman
Погугли что такое матрицы вообще, и как они работают.
Почитай в сдк о том, что такое мировая, видовая, и проективная матрицы.

Серьёзно, не пытайся прыгать через голову.
Ты не понимаешь самих основ, а уже лезешь вперёд.
Не надо проблемы своего невежества на форум вываливать.

> просто у мну в камере всего 2 переменные.
> положение камеры в мире и вектор взгляда.
Вот это вообще убило :)
Всякое желание что-то разъяснять сразу пропало.

progmanПостоялецwww12 мар. 200714:02#14
Nikopol
>> просто у мну в камере всего 2 переменные.
>> положение камеры в мире и вектор взгляда.
>Вот это вообще убило :)
>Всякое желание что-то разъяснять сразу пропало.

какие мы пафосные. сам то небось атнють не с глубоким знанием D3D родился.
или собственное нубство-лузерство быстро забывается?

Страницы: 1 2 3 4 Следующая

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

2001—2014 © GameDev.ru — Разработка игр