![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
D3D, Местоположение точки [D7, WinXP]
Pa5ha © (2004-04-02 15:46:00)Как определить местоположение точки на поверхности, куда она будет выведена с помощью Direct3D? Т.е. двумерные координаты.
Pa5ha (2004-04-06 18:56:00) [1]Спасибо.
Sapersky (2004-04-02 17:44:00) [2]D3DXProject или вручную:
function VectorMulMat(const vec: TVector; const mat: TMatrix): TVector;
begin
Result.x := mat._11*vec.x + mat._21*vec.y + mat._31*vec.z + mat._41;
Result.y := mat._12*vec.x + mat._22*vec.y + mat._32*vec.z + mat._42;
Result.z := mat._13*vec.x + mat._23*vec.y + mat._33*vec.z + mat._43;
end;
function VectorMulMatEx(const vec: TVector; const mat: TMatrix): TVector;
Var w : Single;
begin
w := mat._14*vec.x + mat._24*vec.y + mat._34*vec.z + mat._44;
Result.x := ( mat._11*vec.x + mat._21*vec.y + mat._31*vec.z + mat._41 ) / w;
Result.y := ( mat._12*vec.x + mat._22*vec.y + mat._32*vec.z + mat._42 ) / w;
Result.z := ( mat._13*vec.x + mat._23*vec.y + mat._33*vec.z + mat._43 ) / w;
end;
function VectorProject(Const Src : TVector;
Const WorldMat, ViewMat, ProjMat: TMatrix;
Const HalfViewSize : TPoint): TVector;
Var v : TVector;
begin
v:=VectorMulMat(Src, WorldMat);
v:=VectorMulMat(v, ViewMat);
v:=VectorMulMatEx(v, ProjMat);
Result.x:=(v.x + 1) * HalfViewSize.x;
Result.y:=(1 - v.y) * HalfViewSize.y;
Result.z:=v.z;
end;
HalfViewSize - половина размера окна вывода.
Способ не самый оптимизированный - если вершин много, лучше сначала перемножить друг на друга матрицы, оформить всё как одну функцию и т.д.