Yurich » 21.07.2003 (Пн) 2:43
Надыбал я у себя на старых дисках перевод с английского, не совсем четкий, но понятный:Плоскость имеет нормаль и так же нормали в вершинах. Прежде, чем мы можем вычислить нормаль для трех вершины на плоскости, мы должны вычислить лицевую нормаль вначале. Мы делаем это, при помощи по точечного умножения разниц значений 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))
Это возвращает точку в 3D пространстве, которая выражает точку направления. Это направление от начала (0,0,0) к точке нормали. Эта линия, которая могла бы быть сделана из этих точек, является нашим направлением. Это значение нормали, которое мы теперь нашли, можно использоваться в нашем коде, но это не очень удобно. Так как нормаль - это только направление, не важно, где в 3D пространстве точка нормали помещена, и как далеко она от (0,0,0). Пример - точка нормали (1000,0,0). Эта точка имеет то же самое направление как и точка нормали (1,0,0). Фактически, при хранение нашей длины нормали, равной единице удобнее, когда мы хотим вычислять углы между нормалями. Но как мы получим нашу векторную длину, чтобы она равнялась единице? Простой, мы делим ее на длину. Теперь, мы находим нашу длину и делим значения, говоря:
length = Sqr((nx*nx)+(ny*ny)+(nz*nz))
nx=nx/length
ny=ny/length
nz=nz/length
Это так для лицевых нормалей, но как относительно нормалей вершин, мы все еще не изучили это однако. Хорошо, что мы просто имеем теперь, экран с вектором нормали под углом 90 градусов. Поэтому, в конечном счете, нормали вершины должны наследовать то же самое правило. Но как мы определим, где 90 градусов из точки, этофактически любое направление вообще. В чем мы нуждаемся здесь, в объекте, у которого все нормали поверхностей вычислены. Затем для каждой вершины мы пробегаем через все поверхности, и выясняем, "использует" ли эта поверхность текущую вершину. Если это так, Вы прибавляете нормаль поверхности к нормали вершины, делайте то же самое со следующей, и так далее. Когда это выполнено, Вы делите нормаль вершины на число "обращений", которые Вы имели прежде (сколько плоскостей использовали эту вершину). Это означает, что нормаль в результате - нормаль, расчитаная из нормалей, которые стоят на 90 градусов на плоском, и следовательно нормаль в результате имела бы прямой угол. Фактически, Вы можете только говорить о прямом угле, не имеется никакого способа сообщать есть или нет, нормальный вектор указывает кооректно, так как каждое направление - прямое направление. Однако, нормали поверхности могут указываться двумя способами, которые противоположны. Это только приводит к противоположной нормали, т.е. (0,0, -1) - напротив (0,0,1) и так далее. Это не делает никакого большого вреда, и это не делает счастливо совершенно часто.