切线创建不好......一切都很好

时间:2017-03-21 21:16:06

标签: vb.net opengl math

我有这个代码,我从几个不同的网站放在一起。 它完美地创造了比特币...但是出于什么原因。切线是捶打的。换句话说,为了使这一点更清晰,代码产生了不好的切线! 切线通常指向下方,与法线相反。我希望它与纹理坐标的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 

这里有一个问题的图片..规范是红色的。切线绿色... BiTangents ..蓝色。 Bad Tangents

3 个答案:

答案 0 :(得分:1)

您可能需要从正常和比特的交叉积重新计算切线。这可以确保法线,切线和比特相互正交。

在我看到的大多数实现中,垂直轴与法线的第一个计算是占位符,因为有无数个可能的轴可供选择,因此需要将其重新计算为orthagonal。 / p>

答案 1 :(得分:1)

在您的代码中,除了案例为0外,您不会将dividend带入微积分。

三角形中的任意两个点形成切线或切线。有无限的可能性。如果要将T和B与某些纹理坐标对齐,则需要更多数学运算。

只需付出一点努力,您就会发现:How to calculate Tangent and Binormal?

答案 2 :(得分:1)

好的......我发现了2个问题..

  1. Dim edge1 = v1 - v2应为Dim edge1 = v1 - v0

  2. 我查看了Ripi2所评论的内容..我观看了视频,我从此重新开始了这个...我搞砸了他改变代码的部分..他删除了分红和if语句并用这一行:

    Dim f As Single = 1.0! / ((deltaU1 * deltaV2) - (deltaU2 * deltaV1))
    
  3. 现在它创建了完美的Tangents和BiTangents。 我使用这两行添加了规范化。

    tangent /= tangent.Length
    bitangent /= bitangent.Length
    

    我希望这可以帮助那里的任何人。