Создание радара
written by CRA
translated by Boris Yatsenko
you can find original english page at
http://www.tasteofhoney.freeserve.co.uk/
В компьютерных играх, особенно в космических, вы часто видели радар внизу или
вверху экрана. В этом учебнике рассказывается как создать такой радар-сканер.
Сканер должен отображать расстояние от меня (которое обычно обозначает камеру)
до любого обьекта вокруг меня. Вы должны найти способ как вычислить расстояние
между view matrix камеры и позицией обьекта (мы должны сократить этот обьект
до точки).
Основная идея основанна на уравнении расстояния (d) от плоскости (normal vector
n) до точки (p):
n0.x * p.x + n0.y * p.y + n0.z * p.z = d
Это математическая основа. Давайте посмотрим на нашу view matrix:
| |
right vector
|
up vector
|
look vector
|
not important
|
| m11 |
m21 |
m31 |
m41 |
| m12 |
m22 |
m32 |
m42 |
| m13 |
m23 |
m33 |
m43 |
|
transform vector
|
m14 |
m24 |
m34 |
m44 |
Мы имеем тут 3 вектора нормали камеры (мы должны их нормализовать прежде
чем использовать). Два из них образуют плоскость а третий это вектор нормали
к этой плоскости. Так у нас есть вектор нормали нашей плоскости от которой
мы должны вычислить расстояние. Этот рисунок показывает этот шаг:

Рисунок показывает правую верхнюю часть плоскости и вектор нормали, вектор
взгляда.
Сейчас вставим это в вышестоящую формулу:
look.x * p.x + look.y * p.y + look.z * p.z = d
результат передняя/задняя дистанция.
up.x * p.x + up.y * p.y + up.z * p.z = d
результат верхняя/нижняя дистанция. (представьте right / look плоскость)
right.x * p.x + right.y * p.y + right.z * p.z = d
результат левое/правое расстояние. (представьте up / look плоскость)
Заметте что p это вектор из вашей камеры до точки где лежит обьект, это значит,
что мы должны вначале вычислить p. Просто вычтите положение камеры из положения
вашего обьекта:
p.x = obj.x - cam.x
p.y = obj.y - cam.y
p.z = obj.z - cam.z
Следующий шаг: рисуем сканер
Я обьясняю этот раздел кратко потому-что любой, кто понял вышесказанное не
должен иметь проблем с выводом сканера на экран:
Сначала, посмотрите на мой сканер (да, это копия старого доброго сканера от
ELITE !)

(этот сканер нарисован в двухмерном виде)
Вкратце:
Вы знаете расстояние от самого нижнего до самого верхнего значения X внешнего
эллипса
так-же расстояние Y направления
сейчас вы определите какому расстоянию в мировых координатах равен один пиксель
в x и in y направлении, к примеру 10
вы можете легко вычислить сколько пикселей на расстоянии от обьекта до центра
(=camera) то есть d / 10 = pixels (не забудьте округлить)
если сделаете это для left / right расстояния вы получите величину x сканера,
для front / back значения y и для up / down значения z
рисуем
D3DIM code:
D3DMATRIX mat;
D3DVECTOR objpos = D3DVECTOR(100,30,70);
D3DVECTOR p
lpDevice->GetTransform(D3DTRANSFORMSTATE_VIEW,&mat);
D3DVECTOR right =Normalize(D3DVECTOR(mat._11,mat._21,mat._31));
D3DVECTOR up =Normalize(D3DVECTOR(mat._12,mat._22,mat._32));
D3DVECTOR look =Normalize(D3DVECTOR(mat._13,mat._23,mat._33));
D3DVECTOR p =D3DVECTOR(objpos.x-mat._41, objpos.y-mat._42, objpos.z-mat._43);
float dx = right.x * p.x + right.y * p.y + right.z
* p.z;
float dy = up.x * p.x + up.y * p.y + up.z * p.z;
float dz = look.x * p.x + look.y * p.y + look.z * p.z;
drawscanner(dx,dy,dz);
.
.
.
.
.
Posted: 13.03.2k1
Author: Boris Yatsenko
<ybv@chat.ru>
|