我正在尝试对对象纹理进行实时绘画。目前使用的是Irrlicht,但这并不重要。
到目前为止,我已经使用以下算法得到了正确的UV坐标:
1. 找出用户选择的物体三角形(射线投射,没有真正困难)。 2. 找出该三角形上交点的UV(重心)坐标。 3. 找出每个三角形顶点的UV(纹理)坐标。 4. 找出交点的UV(纹理)坐标。 5. 计算交点的纹理图像坐标。
但不知何故,当我在第五步中绘制所得点的纹理图像时,结果完全错误。因此,在光标点处绘制矩形时,其X(或Z)坐标被反转。
以下是我用于获取纹理坐标的代码:
我希望能够实时地使我的对象可绘制。我目前遇到的问题是:纹理坐标计算错误和非唯一顶点UV坐标(因此,在矮人斧子的一侧绘制某些东西将在该斧子的另一侧绘制相同的东西)。
我应该怎么做?
到目前为止,我已经使用以下算法得到了正确的UV坐标:
1. 找出用户选择的物体三角形(射线投射,没有真正困难)。 2. 找出该三角形上交点的UV(重心)坐标。 3. 找出每个三角形顶点的UV(纹理)坐标。 4. 找出交点的UV(纹理)坐标。 5. 计算交点的纹理图像坐标。
但不知何故,当我在第五步中绘制所得点的纹理图像时,结果完全错误。因此,在光标点处绘制矩形时,其X(或Z)坐标被反转。
以下是我用于获取纹理坐标的代码:
core::vector2df getPointUV(core::triangle3df tri, core::vector3df p)
{
core::vector3df
v0 = tri.pointC - tri.pointA,
v1 = tri.pointB - tri.pointA,
v2 = p - tri.pointA;
float dot00 = v0.dotProduct(v0),
dot01 = v0.dotProduct(v1),
dot02 = v0.dotProduct(v2),
dot11 = v1.dotProduct(v1),
dot12 = v1.dotProduct(v2);
float invDenom = 1.f / ((dot00 * dot11) - (dot01 * dot01)),
u = (dot11 * dot02 - dot01 * dot12) * invDenom,
v = (dot00 * dot12 - dot01 * dot02) * invDenom;
scene::IMesh* m = Mesh->getMesh(((scene::IAnimatedMeshSceneNode*)Model)->getFrameNr());
core::array<video::S3DVertex> VA, VB, VC;
video::SMaterial Material;
for (unsigned int i = 0; i < m->getMeshBufferCount(); i++)
{
scene::IMeshBuffer* mb = m->getMeshBuffer(i);
video::S3DVertex* vertices = (video::S3DVertex*) mb->getVertices();
for (unsigned long long v = 0; v < mb->getVertexCount(); v++)
{
if (vertices[v].Pos == tri.pointA)
VA.push_back(vertices[v]); else
if (vertices[v].Pos == tri.pointB)
VB.push_back(vertices[v]); else
if (vertices[v].Pos == tri.pointC)
VC.push_back(vertices[v]);
if (vertices[v].Pos == tri.pointA || vertices[v].Pos == tri.pointB || vertices[v].Pos == tri.pointC)
Material = mb->getMaterial();
if (VA.size() > 0 && VB.size() > 0 && VC.size() > 0)
break;
}
if (VA.size() > 0 && VB.size() > 0 && VC.size() > 0)
break;
}
core::vector2df
A = VA[0].TCoords,
B = VB[0].TCoords,
C = VC[0].TCoords;
core::vector2df P(A + (u * (C - A)) + (v * (B - A)));
core::dimension2du Size = Material.getTexture(0)->getSize();
CursorOnModel = core::vector2di(Size.Width * P.X, Size.Height * P.Y);
int X = Size.Width * P.X, Y = Size.Height * P.Y;
// DRAWING SOME RECTANGLE
Material.getTexture(0)->lock(true);
Device->getVideoDriver()->setRenderTarget(Material.getTexture(0), true, true, 0);
Device->getVideoDriver()->draw2DRectangle(video::SColor(255, 0, 100, 75), core::rect<s32>((X - 10), (Y - 10),
(X + 10), (Y + 10)));
Device->getVideoDriver()->setRenderTarget(0, true, true, 0);
Material.getTexture(0)->unlock();
return core::vector2df(X, Y);
}
我希望能够实时地使我的对象可绘制。我目前遇到的问题是:纹理坐标计算错误和非唯一顶点UV坐标(因此,在矮人斧子的一侧绘制某些东西将在该斧子的另一侧绘制相同的东西)。
我应该怎么做?