Войти
ПрограммированиеФорумГрафика

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

#0
11:23, 18 окт. 2005

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


#1
11:23, 18 окт. 2005

Пожалуйста помогоите реализовать этот алгоритм на Visual Basic (или на другом basic).
Я не понимаю эти строки:

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

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

rot = rot.Inverse();

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

#2
11:37, 18 окт. 2005

получаешь два вектора: (v2-v1) и (v3-v2). Перемножаешь их между собой векторно, и получаешь третий вектор - n = Cross( (v2-v1), (v3-v2)). Нормализыуешь полученный вектор n. Считаешь вектор (v2-v1) и опять нормализуешь его. Обращаешь матрицу rot

#3
14:02, 18 окт. 2005

"^" - вот это:

u.y*v.z-u.z*v.y, u.z*v.x-u.x*v.z, u.x*v.y-u.y*v.x;

#4
16:22, 18 окт. 2005

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.
Пожалуйста разъясни.

#5
14:04, 24 окт. 2005

Мужики! Ну хоть кто-нибудь обясните этот алгоритм для новичка  (нет у меня высшего образования).  А то у меня нижний левый треугольник рисуется нормально, а верхний правый глючит. Пожалуйста помогите!

#6
1:42, 25 окт. 2005

Э-э-эй! Кто-нибудь здесь есть?
Ну помогите, а?!

#7
10:32, 25 окт. 2005

antarman: Че непонятно-то? Векторное произведение тебе покомпонентно расписали. Осталось только написать соотв. функцию.
Normalize(v), где v - вектор, возвращает вектор, где все компоненты поделены на длину вектора v.
Inverse(m) видимо обратная к m матрица. Довольно нетривиальная вещь.
Лучше всего взять библиотеку для работы с векторами и матрицами и использовать ее функции. Или в Бейсике таких нет?

#8
1:45, 26 окт. 2005

Вот как это сделал я:

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

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

Прошло более 5 лет
#9
0:49, 23 янв. 2011

некрокомент.

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

Прошло более 1 года
#10
14:46, 25 окт. 2012

Помогите решить задачу. Есть 4 вершины в 3d они образуют 2 треугольника. Нужно найти текстурные координаты для всех  вершин. Для 3 вершин первого треугольника текстурные координаты можно найти способом описанным в статье, а как найти координаты четвертой вершины?

Прошло более 1 года
#11
0:42, 3 фев. 2014

Этот алгоритм будет работать только если вы используете тот же метод текстурирования что и в Quake.

Прошло более 4 лет
#12
13:09, 11 авг. 2018

Alek-de-MIk
> тот же метод текстурирования что и в Quake
А какой метод текстурирования в кваки, подскажи пожалуйста, ибо пишу загрузчик bsp карты и столкнулся с проблемой, что текстуры не масштабируются

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

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