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

Как получить UV - координату на 2D-треугольнике?

#0
11:49, 21 янв. 2019

Здравствуйте. Есть плоский треугольник, у каждой его вершины есть какая-то текстурная координата (UV). Как мне получить правильную UV-координату для произвольной точки внутри этого треугольника (знаю координаты (XY) точки на плоскости, нужно получить UV)? Под правильной я понимаю ту, которую реально отобразит графическое API, а не какую-то "приблизительную на глаз". Понятно, что я могу как-то посчитать веса по удаленности от каждой вершины, потом все вершины сложить по весам и поделить на сумму весов. Но это будет "мнемоническое" решение. А какое решение верное с точки зрения железа? Как это считают карточки?


#1
12:02, 21 янв. 2019

Чем через барицентрики не нравится?

#2
12:04, 21 янв. 2019

Гугли : Барицентрические координаты.
https://www.scratchapixel.com/lessons/3d-basic-rendering/ray-trac… c-coordinates

#3
12:06, 21 янв. 2019

Спасибо, буду разбираться :)

#4
12:17, 21 янв. 2019

Барицентрика.
Попутно проверяет попала ли точка в треугольник. Иначе вернет фолс.
Это basic. Думаю поймешь.

' -------------------------------------------------------------------------------------------------------------------
' This Function tells you If a point is inside a triangle, in 2D.
' It also calculates the UV coordinates of said point as part of the intersection test.
'
' Pxy is a point.
'
' V0xy, V1xy, And V2xy, are the locations of the three vertices of the triangle.
'
' For these vertices, V0 is location of UV(0,0), V1 is the location of UV(1, 0), And V2 is the location of UV(0,1)
'
' These are important To know If you want To Return the exact location in texture space of the collision, but
' you don't have to worry about them if you only want to find out if a collision occured.
' -------------------------------------------------------------------------------------------------------------------
Function PointInTri@(Px#, Py#, V0x#, V0y#, V1x#, V1y#, V2x#, V2y#, U# Var, V# Var)

  ' Vector(e1,v1,v0)
  Local E1x# = V1x - V0x
  Local E1y# = V1y - V0y

  ' Vector(e2,v2,v0)
  Local E2x# = V2x - V0x
  Local E2y# = V2y - V0y

  ' crossproduct(h,d,e2)
  Local Hx# = -E2y
  Local Hy# =  E2x 

  ' a = dotproduct(e1,h)
  Local A# = (E1x * Hx) + (E1y * Hy) 
  
  Local F# = 1.0 / A
  
  ' Vector(s,p,v0)
  Local Sx# = Px - V0x
  Local Sy# = Py - V0y
    
  'u = f * (dotProduct(s,h))
  U# = F * ((Sx * Hx) + (Sy * Hy))
  
  ' If the value of the U coordinate is outside the range of values inside the triangle,
  ' Then the ray has intersected the plane outside the triangle.
  If (U < 0) Or (U > 1) Then Return False
  
  ' crossProduct(q,s,e1)
  Local Qz# = (Sx * E1y) - (E1x * Sy)

  ' v = f * dotProduct(d,q)
  V# = F * Qz
  
  ' If the value of the V coordinate is outside the range of values inside the triangle,
  ' Then the ray has intersected the plane outside the triangle.
  If (V < 0) Or (V > 1) Then Return False

  ' U + V together cannot exceed 1.0 Or the point is Not in the triangle. 
  ' If you imagine the triangle as half a square this makes sense.  U=1 V=1 would be in the 
  ' Lower Left hand corner which would be in the second triangle making up the square.
  If (U + V) > 1 Then Return False

  ' The point was in the triangle. Yay!    
  Return True
  
  ' Note that you could also Return the U And V coordinates calculated in this Function
  ' If you need those values!
End Function
#5
12:26, 21 янв. 2019

Went
Барицентрические координаты.
https://www.scratchapixel.com/lessons/3d-basic-rendering/ray-trac… c-coordinates
https://fgiesen.wordpress.com/2013/02/06/the-barycentric-conspirac/

Если треугольник в плоскости экрана, то интерполяция самих UV взвешена барицентрическими координатами, если общий - линейно интерполируются u/w, v/w, 1/w (где w - глубина).

#6
14:53, 21 янв. 2019

Барицентрические координаты оптимально считать через площади соответствующих треугольников или это большой оверхед?

#7
14:58, 21 янв. 2019

Went
> Барицентрические координаты оптимально считать через площади соответствующих
> треугольников или это большой оверхед?
Ну, если ты эти площади считаешь не через формулу Герона, то нормально.
Если ты по линии идёшь через много точек, то есть смысл запомнить приращение, чтоб ускорить вычисление.

#8
15:53, 21 янв. 2019

Спасибо всем за советы, заработало!

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

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