Die Bilder sehen auf jeden Fall alles andere als korrekt aus. Wenn du sie um 0.5 zentrieren würdest, damit man auch sieht, wie weit sie die Vektoren in's negative gehen, wäre das allerdings hilfreich.
Zu den Tangenten:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
void SFObject3D::RecalcTanbino()
{
if( !miVertexCount )
{
return;
}
for( int i=0; i<miVertexCount; ++i )
{
mVertices[i].mTangent.mX = mVertices[i].mTangent.mY = mVertices[i].mTangent.mZ = 0;
mVertices[i].mBinormal.mX = mVertices[i].mBinormal.mY = mVertices[i].mBinormal.mZ = 0;
}
for( int i=0; i<~mlIndices/3; ++i )
{
int off = i*3;
AVector3DD p21 = mVertices[mlIndices[off+1]].mCoord-mVertices[mlIndices[off+0]].mCoord,
p31 = mVertices[mlIndices[off+2]].mCoord-mVertices[mlIndices[off+0]].mCoord,
uv21 = mVertices[mlIndices[off+1]].mTexCoords[0]-mVertices[mlIndices[off+0]].mTexCoords[0],
uv31 = mVertices[mlIndices[off+2]].mTexCoords[0]-mVertices[mlIndices[off+0]].mTexCoords[0];
AVector3DD tangent = (p21*uv31.mY)-(p31*uv21.mY),
binormal = (p31*uv21.mX)-(p21*uv31.mX);
for( int side=0; side<3; ++side )
{
mVertices[mlIndices[off+side]].mTangent += tangent.Normalize();
mVertices[mlIndices[off+side]].mBinormal += binormal.Normalize();
}
/*
(v3 - v1).(p2 - p1) - (v2 - v1).(p3 - p1)
T = ---------------------------------------
(u2 - u1).(v3 - v1) - (v2 - v1).(u3 - u1)
(u3 - u1).(p2 - p1) - (u2 - u1).(p3 - p1)
B = ---------------------------------------
(v2 - v1).(u3 - u1) - (u2 - u1).(v3 - v1) */
}
for( int i=0; i<miVertexCount; ++i )
{
mVertices[i].mTangent.Normalize();
mVertices[i].mBinormal.Normalize();
}
}
|