Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Вычисление текстурных координат полигона. (Комментарии к статье)

Вычисление текстурных координат полигона. (Комментарии к статье)

robotПостоялецwww18 окт. 200511:23#0
antarmanНовичокwww18 окт. 200511:23#1
Пожалуйста помогоите реализовать этот алгоритм на Visual Basic (или на другом basic).
Я не понимаю эти строки:

//Вычисляем нормаль треугольника:
n = Normalize((v2 - v1) ^ (v3 - v2)); //Оператор "^" - Cross Product.

//В качестве X-вектора возьмем направляющий вектор первого ребра(v1..v2):
rot_x = Normalize(v2 - v1);

rot = rot.Inverse();

Очень прошу, помогите.

kasПостоялецwww18 окт. 200511:37#2
получаешь два вектора: (v2-v1) и (v3-v2). Перемножаешь их между собой векторно, и получаешь третий вектор - n = Cross( (v2-v1), (v3-v2)). Нормализыуешь полученный вектор n. Считаешь вектор (v2-v1) и опять нормализуешь его. Обращаешь матрицу rot
st0keПостоялецwww18 окт. 200514:02#3
"^" - вот это:
u.y*v.z-u.z*v.y, u.z*v.x-u.x*v.z, u.x*v.y-u.y*v.x;
antarmanНовичокwww18 окт. 200516:22#4
st0ke разъясни пожалуйста подробнее.

на форуме по Blitz3D мне написали следующее:
Cross Product - векторное произведение, т.е. CrossProduct от векторов v1 и v2 будет вектор
|v1.y * v2.z - v1.z * v2.y|
|v1.z * v2.x - v1.x * v2.z|
|v1.x * v2.y - v1.z * v2.x|
Normalize - возвращает вектор единичной длины в том же направлении, что и данный вектор.
Inverse - вообще просто - x=-x; y=-y;z=-z у вектора.

А откуда у тебя взялись u и v.
Пожалуйста разъясни.

antarmanНовичокwww24 окт. 200514:04#5
Мужики! Ну хоть кто-нибудь обясните этот алгоритм для новичка  (нет у меня высшего образования).  А то у меня нижний левый треугольник рисуется нормально, а верхний правый глючит. Пожалуйста помогите!
antarmanНовичокwww25 окт. 20051:42#6
Э-э-эй! Кто-нибудь здесь есть?
Ну помогите, а?!
MirageПостоялецwww25 окт. 200510:32#7
antarman: Че непонятно-то? Векторное произведение тебе покомпонентно расписали. Осталось только написать соотв. функцию.
Normalize(v), где v - вектор, возвращает вектор, где все компоненты поделены на длину вектора v.
Inverse(m) видимо обратная к m матрица. Довольно нетривиальная вещь.
Лучше всего взять библиотеку для работы с векторами и матрицами и использовать ее функции. Или в Бейсике таких нет?
antarmanНовичокwww26 окт. 20051:45#8
Вот как это сделал я:

Function AutoUVMaping(mesh)

For s=1 To CountSurfaces (mesh)
surf=GetSurface (mesh,s)

For t=0 To CountTriangles (surf)-1

FillVector 0,0,0,0

; vertexs from triangle
v0=TriangleVertex(surf,t,0)
v1=TriangleVertex(surf,t,1)
v2=TriangleVertex(surf,t,2)

; first vertex
v0x#=VertexX(surf,v0)
v0y#=VertexY(surf,v0)
v0z#=VertexZ(surf,v0)

; second vertex
v1x#=VertexX(surf,v1)
v1y#=VertexY(surf,v1)
v1z#=VertexZ(surf,v1)

; third vertex
v2x#=VertexX(surf,v2)
v2y#=VertexY(surf,v2)
v2z#=VertexZ(surf,v2)

; triangle normal
TriangleNormal(v0x,v0y,v0z,v1x,v1y,v1z,v2x,v2y,v2z)
nx#=VectorX()
ny#=VectorY()
nz#=VectorZ()

; rotate matrix
rzx#=nx
rzy#=ny
rzz#=nz

Normalize v2x-v1x,v2y-v1y,v2z-v1z
rxx#=VectorX()
rxy#=VectorY()
rxz#=VectorZ()

CrossProduct rxx,rxy,rxz,rzx,rzy,rzz
ryx#=VectorX()
ryy#=VectorY()
ryz#=VectorZ()

ReverseVector rxx,rxy,rxz
rxx=VectorX()
rxy=VectorY()
rxz=VectorZ()

ReverseVector ryx,ryy,ryz
ryx=VectorX()
ryy=VectorY()
ryz=VectorZ()

ReverseVector rzx,rzy,rzz
rzx=VectorX()
rzy=VectorY()
rzz=VectorZ()

; transformed vertex
vt0x#=((rxx*v0x)+(rxy*v0y)+(rxz*v0z))
vt0y#=((ryx*v0x)+(ryy*v0y)+(ryz*v0z))
vt0z#=((rzx*v0x)+(rzy*v0y)+(rzz*v0z))

vt1x#=((rxx*v1x)+(rxy*v1y)+(rxz*v1z))
vt1y#=((ryx*v1x)+(ryy*v1y)+(ryz*v1z))
vt1z#=((rzx*v1x)+(rzy*v1y)+(rzz*v1z))

vt2x#=((rxx*v2x)+(rxy*v2y)+(rxz*v2z))
vt2y#=((ryx*v2x)+(ryy*v2y)+(ryz*v2z))
vt2z#=((rzx*v2x)+(rzy*v2y)+(rzz*v2z))

VertexTexCoords surf,v0,vt0x,vt0y
VertexTexCoords surf,v1,vt1x,vt1y
VertexTexCoords surf,v2,vt2x,vt2y

Next
Next
End Function

Нижний левый треугольник отображается корректно, а верхний правый - растягивается и вращается. Что я сделал не так?

coordBoxПостоялецwww23 янв. 20110:49#9
некрокомент.

Статья хорошая! всё сделал. Ничерта невышло... А именно. Когда триугольники в одной плоскости в любой. всё на них накладывается нормально. А вот стоит нарисовать сетку и вытянуть некоторые вершины. на них хренпойми что.

HumanAPIПостоялецwww25 окт. 201214:46#10
Помогите решить задачу. Есть 4 вершины в 3d они образуют 2 треугольника. Нужно найти текстурные координаты для всех  вершин. Для 3 вершин первого треугольника текстурные координаты можно найти способом описанным в статье, а как найти координаты четвертой вершины?
Alek-de-MIkПостоялецwww3 фев. 20140:42#11
Этот алгоритм будет работать только если вы используете тот же метод текстурирования что и в Quake.

/ Форум / Программирование игр / Графика

Тема в архиве.

2001—2018 © GameDev.ru — Разработка игр