我有这个代码,我从几个不同的网站放在一起。 它完美地创造了比特币...但是出于什么原因。切线是捶打的。换句话说,为了使这一点更清晰,代码产生了不好的切线! 切线通常指向下方,与法线相反。我希望它与纹理坐标的V轴对齐。 奇怪的是,我使用正常和切线的交叉来获得比特币,这很好。
我试过翻转坐标,紫外线...几乎所有东西.. 我的数学不是很好,所以..有人可以看看我的代码,看看它是否合适"?谢谢!
Private Sub ComputeTangentBasis(ByRef p0 As vertex_data, ByRef p1 As vertex_data, ByRef p2 As vertex_data)
Dim tangent, bitangent As Vector3D
Dim n As Vector3D
n.X = p0.nx
n.Y = p0.ny
n.Z = p0.nz
'convert to vector3d type... they are WAY easier to do complex math with!!
Dim v0 = convert_vector3d(p0)
Dim v1 = convert_vector3d(p1)
Dim v2 = convert_vector3d(p2)
Dim edge1 = v1 - v2
Dim edge2 = v2 - v0
Dim deltaU1 = (p1.u - p0.u) * -0.1
Dim deltaU2 = (p2.u - p0.u) * -0.1
Dim deltaV1 = (p1.v - p0.v) * -0.1
Dim deltaV2 = (p2.v - p0.v) * -0.1
Dim dividend = (deltaU1 * deltaV2) - (deltaU2 - deltaV1)
Dim f As Double
If dividend = 0.0 Then
f = 1.0
End If
tangent.X = f * ((deltaV2 * edge1.X) - (deltaV1 * edge2.X))
tangent.Y = f * ((deltaV2 * edge1.Y) - (deltaV1 * edge2.Y))
tangent.Z = f * ((deltaV2 * edge1.Z) - (deltaV1 * edge2.Z))
bitangent = Vector3D.CrossProduct(tangent, n)
'
p0.t.x = tangent.X
p0.t.y = tangent.Y
p0.t.z = tangent.Z
p0.bt.x = bitangent.X
p0.bt.y = bitangent.Y
p0.bt.z = bitangent.Z
'
p1.t.x = tangent.X
p1.t.y = tangent.Y
p1.t.z = tangent.Z
p1.bt.x = bitangent.X
p1.bt.y = bitangent.Y
p1.bt.z = bitangent.Z
'
p2.t.x = tangent.X
p2.t.y = tangent.Y
p2.t.z = tangent.Z
p2.bt.x = bitangent.X
p2.bt.y = bitangent.Y
p2.bt.z = bitangent.Z
End Sub
答案 0 :(得分:1)
您可能需要从正常和比特的交叉积重新计算切线。这可以确保法线,切线和比特相互正交。
在我看到的大多数实现中,垂直轴与法线的第一个计算是占位符,因为有无数个可能的轴可供选择,因此需要将其重新计算为orthagonal。 / p>
答案 1 :(得分:1)
在您的代码中,除了案例为0外,您不会将dividend
带入微积分。
三角形中的任意两个点形成切线或切线。有无限的可能性。如果要将T和B与某些纹理坐标对齐,则需要更多数学运算。
只需付出一点努力,您就会发现:How to calculate Tangent and Binormal?
答案 2 :(得分:1)
好的......我发现了2个问题..
Dim edge1 = v1 - v2应为Dim edge1 = v1 - v0
我查看了Ripi2所评论的内容..我观看了视频,我从此重新开始了这个...我搞砸了他改变代码的部分..他删除了分红和if语句并用这一行:
Dim f As Single = 1.0! / ((deltaU1 * deltaV2) - (deltaU2 * deltaV1))
现在它创建了完美的Tangents和BiTangents。 我使用这两行添加了规范化。
tangent /= tangent.Length
bitangent /= bitangent.Length
我希望这可以帮助那里的任何人。