Odyssey paper #07 17 марта 1999

# Алгоритмы - Просто о 3D програмировании: 3D координаты и нормали.

``` Алгоритмы
_________

Подготовленно по материалам, собранным из
закоулков всего програмного мира  преступ-
ными организациями, то бишь Hackers Group.
Отфиксено под стандарт Odyssey by  Phantom
Lord.

3d Basic - Просто о 3D
______________________

For a start, lets look at some of the   3d
basics. At first, what is 3d? Well, 3d  is
short for three dimensional,  a  dimension
we often say we as people live in.    Now,
lets look at some of the other dimension ,
maybe this would help us understanding 3d.
One dimensional are just a line, and   our
position on this line are represented   by
the letter x.Two dimensional are represen-
ted by the letters x and y. This  is  what
we know as a coordinatesystem, x goes from
left to right and y from lower to upper.
This is actually also our screen. Now, the
third dimension are represented by x,y and
z. This new axis, z, moves in and out   of
our coordinate system,it gives us a depth.
This is what we see in reality too.Take an
example. Close one of your eyes (since two
eyes confuses the 3d view) and take out  a
pen. Hold this pen as far away as possible
and think of this as z value 100. Now  by,
moving the pen closer to your eye,you dec-
rease the z value, and when you cant   get
further, you have a z value of one,   Now,
with a depth value of one, we have the ac-
tual size of the pen. The pen is now  much
larger than it was before,  often   larger
than the sun itself. Although we know  the
sun is actually thousands, maybe even mil-
lions of kilometers in radius, we only see
is as a ball no larger than 2-3 centimeter
wide. This is because of the distance bet-
ween you and the sun,which are 8 light mi-
nuttes. Now, if you stod 1 centimeter from
the sun, you would see its actual size,but
moving 1 centimeter away, it would be half
the size in your eyes. Now, although  this
is not completely true, the princip    are
correct, very correct indeed. So, we   can
find the x and y values that we see apoint
as, by knowing its x, y and z coordinates.
The formul ars are:

Для начала, давайте рассмотрим  некоторые
основы 3D. Сначала, что такое 3D? Хорошо ,
3D сокращение от трехмерной   размерности.
Теперь, давайте рассмотрим некоторую  дру-
гую размерность, возможно это      поможет
нам понимать 3D. Одномерность - только ли-
ния, и наше положение на этой линии предс-
тавлено буквой x. Двумерность -  представ-
лена буквами x и y. Это - то, что мы назы-
ваем координатной системой, x идет   слева
направо и y   снизу   вверх. Это -  факти-
чески также наш экран. Теперь,трехмерность
представлена x,y и z. Эта новая ось,    z,
движется от нас  в глубь из нашей  системы
координат, это дает нам глубину. Это - то,
что мы видим фактически также.Возьмем при-
мер. Закройте один из ваших глаз (так  как
два глаза путают 3D просмотр)  и  возьмите
перо. Отведите это перо настолько   далеко
насколько возможно, и думайте что z  равно
100 при этом. Теперь,перемещайте перо бли-
же к вашему глазу, при этом Вы  уменьшаете
значение z, и когда Вы не   можете  больше
перемещать, Вы имеете значение z один.
Теперь, со значением глубины один,мы име-
ем фактический размер пера.  Перо   теперь
намного большее чем было прежде,     часто
больше, чем солнце.Хотя мы знаем,что солн-
це - фактически тысячи, возможно даже мил-
лионы километров в радиусе, мы только  ви-
дим его как шарик не больше в диаметре,чем
2-3 сантиметра.Это - из-за расстояния меж-
ду Вами и солнцем, которое составляет    8
световых минут. Теперь, если Вы cтояли в 1
сантиметре от солнца,Вы видели бы его фак-
тический размер, но перемещение 1   санти-
метра в сторону, это будет половина разме-
ра в ваших глазах. Теперь,хотя это не пол-
ностью истинно, принцип правилен,    очень
правилен действительно. Так, мы можем  на-
ходить x и значения y, где мы видим  точку
зная x, y и z координаты. Формулы:

x' = x/z
y' = y/z

Note, that since we use a computer,we ne-
ed to add half the screen coordinates   to
the result. This is because the point 0,0,
0 would be found at the upperleft   corner
of our screen. Therefore, if we add    128
and 96 to our value, we can see both nega-
tive and positive x/y values.
The formulars we should use would then
be:

Заметим, что,так как мы используем компь-
ютер, мы должны прибавить половину  экран-
ных координат к результату. Это - то,  по-
тому что иначе точка 0,0,0 была бы найдена
в левом верхнем углу нашего экрана. Следо-
вательно, если мы добавляемся 128 и 96   к
нашему значению, мы можем видеть, и  отри-
цательные и положительные значения x/y.
Формулы, которые мы должны использовать ,
были бы затем:

x' =  x/z+128
y' =  y/z+96

Now, the basics about what 3d are  should
be in place.

Это основные сведения о 3D .

Normals - Нормали
_________________

If we want to do several new 3d routines,
like backface removal, environment mapping
and lightsources, we have to know of  nor-
mals. In backface removal we find out   if
they are facing away from us, in  enirmon-
ment mapping they give us our u and v  co-
ordinates, and in light sources we     use
them to find the light intensity. Actually
normals are not only used in 3d, they  are
also used in 2d, and thats the place where
we should start learning about them.  Nor-
mals are a direction,not a point in space.
The important thing about normals, and the
handy thing,is that they are point 90 deg-
ress out in space from their orign.

Если мы хотим делать несколько новых  3-D
процедур, подобно удалению невидимой   по-
верхности, вывода окружения и   источников
света, мы должны знать о нормалях. При  у-
далении невидимой поверхности они (   нор-
мали ) указывают от нас   ли   поверхности
направлены, при выводе окружения они  дают
нам наши координаты u и v, и в  источниках
освещения, мы используем их, чтобы   найти
интенсивность света. Фактически    нормали
используются не только в 3D, они также ис-
пользуются в 2D, и это место,где мы должны
начать обучаться относительно них.

Нормали - направление,а не точка в прост-
ранстве.Важная вещь относительно нормалей,
и удобная вещь, это то, что они всегда на-
правлены под углом 90 градусов во вне    в
пространство относительно их начала на по-
верхности.

The trouble, as one can see,is that there
are two normals per line. They point    in
each their direction, each one the opposit
of the other. This is actually  a    great
problem in 3d normals, since this    could
course objects to be invisible,due to back
face removal, or it could mess up the  en-
vironment mapper, or angle to  the   light
source. Actually, there is no way to solve
this.
Now, in 3d we have both faces and vertic-
es. A face have a normal and so do vertic-
es. Before we can calculate the normal for
the three vertices in a face, we need   to
calculate the face normal first.We do this
by taking the dotproduct of the delta x, y
and z values. This would look like this in
code:

Затруднение, как можно видеть, появляется
там, где две нормали на линию. Они  указы-
вают каждая в своем направлении, каждая о-
позиционно другой. Это фактически  большая
проблема в 3D нормалях, так как это  могло
быть направление на объект, чтобы быть не-
видимым, из-за удаление обратных   поверх-
ностей, или это могло бы внести беспорядок
в вывод окружения,или угол на источник ос-
вещения. Фактически, не имеется   никакого
способа решить это. Теперь, в 3D мы имеем,
и плоскости и вершины.Плоскость имеет нор-
маль и так же нормали в вершинах. Прежде ,
чем мы можем вычислить нормаль для    трех
вершин на плоскости, мы должны   вычислить
лицевую нормаль вначале. Мы делаем это   ,
при помощи поточечного умножения   разниц
значений x, y и z. Это походило бы на  это
в коде:

nx = ((y1-y2)*(z1-z3))-((z1-z2)*(y1-y3));
ny = ((z1-z2)*(x1-x3))-((x1-x2)*(z1-z3));
nz = ((x1-x2)*(y1-y3))-((y1-y2)*(x1-x3));

This returns a point in 3d space which is
a direction point. This is the   direction
from the orign (0,0,0)to the normal point.
This line which could be made from   these
points, are our direction. This normal va-
lue which we now have found, could be used
in our code, but this isnt very handy.Sin-
ce a normal is only a direction, it doesnt
matter where in 3d space the normal  point
are placed, as long the direction from (0,
0,0) are the same.
Example could be the normal point  (1000,
0,0). This point returns the same directi-
on as the normal point (1,0,0). Actually ,
keeping our normal length equal  to    one
turns out quite handy later on, when    we
wants to calculate angles between normals.
But how do we get our vector length to  e-
qual one? Simple, we divide by its length.
Now, we find our length and divide the va-
lues by saying:

Это возвращает точку в 3D пространстве  ,
которая выражает точку направления.    Это
направление от начала (0,0,0) к точке нор-
мали. Эта линия,которая могла бы быть сде-
лана из этих точек, является нашим направ-
лением. Это значение нормали, которое   мы
теперь нашли, можно использовать в   нашем
коде, но это не очень удобно. Так как нор-
маль - это только направление, не важно  ,
где в 3D пространстве точка нормали  поме-
щена, и как далеко она от (0,0,0).  Пример
- точка нормали (1000,0,0). Эта точка име-
ет то же самое направление как    и  точка
нормали (1,0,0). Фактически, при  хранении
нашей длины нормали, равной единице  удоб-
нее, когда мы хотим вычислять углы   между
нормалями. Но как мы получим нашу  вектор-
ную длину, чтобы она равнялась единице?
Просто мы делим ее на длину. Теперь,   мы
находим нашу длину и делим значения:

length = sqrt((nx*nx)+(ny*ny)+(nz*nz));
nx=nx/length;
ny=ny/length;
nz=nz/length;

That much for face normals, but how about
vertex normals,we still haven't looked in-
to this yet. Well, what we basicly    have
got now, is a face with a normalvector po-
inting 90 degress out of it. So, eventual-
ly, the vertex normals must follow the sa-
me rule. But how do we determine where  90
degrees from a point is, it would actually
be any direction at all.What we need here,
is an object which facenormals are all cal
culated. Then for every vertex we run tro-
ugh every face, and finds out if this face
"uses" the current vertex. If it does, you
add the facenormal to the vertexnormal, do
the same with the next, and so on.    When
this is done, you divide the  vertexnormal
by the number of "hits" you had before(how
many faces that used that vertex).This me-
ans, that the result normal  is  a  normal
calculated out of normals which stand   90
degress flat, and therefore the result nor
mal would have the right angle.  Actually,
you can only talk about a right angle,the-
re is no obvius way of telling wether   or
not the normal vector are pointing cerrec-
tly, since every direction is the    right
direction. However, the facenormals    can
point two ways, which tends to get   wuite
anoying sometimes.This only results in the
opposite normal, e.g (0,0,-1) is  opposite
of (0,0,1) and so on.It does no great harm
and it doesn't happend quite often.

Это так для лицевых нормалей, но как  от-
носительно нормалей вершин, мы все еще  не
изучили это однако. Хорошо, что мы  просто
имеем теперь, экран с вектором нормали под
углом 90 градусов. Поэтому,в конечном сче-
те, нормали вершины должны наследовать  то
же самое правило. Но как мы определим, где
90 градусов из точки, это фактически любое
направление вообще. В чем  мы    нуждаемся
здесь, в объекте, у которого все   нормали
поверхностей вычислены. Затем для   каждой
вершины мы пробегаем через все поверхности
и выясняем, "использует" ли эта    поверх-
ность текущую вершину. Если это так,    Вы
прибавляете нормаль поверхности к  нормали
вершины, делайте то же самое со следующей,
и так далее. Когда это выполнено, Вы дели-
те нормаль вершины на число "обращений"  ,
которые Вы имели прежде (сколько  плоскос-
тей использовали эту вершину). Это означа-
ет, что нормаль в результате - нормаль   ,
расчитаная из нормалей, которые стоят   на
90 градусов на плоском,  и   следовательно
нормаль в результате имела бы прямой угол.
Фактически, Вы можете только говорить    о
прямом угле, не имеется никакого   способа
сообщать есть или нет,  нормальный  вектор
указывает корректно,так как каждое направ-
ление - прямое направление. Однако, норма-
ли поверхности могут   указываться   двумя
способами, которые противоположны.     Это
только приводит к противоположной нормали,
т.е. (0,0, -1) - напротив (0,0,1) и    так
далее.Это не делает никакого большого вре-
да, и это не делает большого счастья.

```

Другие статьи номера:

## От авторов - создатели газеты.

Похожие статьи:

В этот день...   3 февраля