Visual Basic - мастерская разработчика
Библиотеки

DirectX

Обзоры
DirectDraw
Direct3D
DirectX Audio
DirectPlay
DirectInput
Fido Topics
SourceCode
Tools&Libs

OpenGL

Статьи и учебники
Fido Topics
SourceCode
Tools&Libs

Архив по Glide

Движки

Обзоры
Учебники
SourceCode
Downloads

Создание игр

Ваши игры

Обзорные статьи
Учебники
Fido Topics
SourceCode
Download

Stuff

Программер-Чат

Псевдо-FTP
Disclaimer
Оффтопик

 

Создание радара

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>

 


Проект
Создание Народного Учебника по OpenGL

Участвовать!
Поиск
Найдите статью или файл:


Рассылка
Новости сайта
La Vision в вашем почтовом ящике








Программирование на С++ Delphi и Паскаль
Центр демо-искусства в России