如何计算按下物体的UV纹理点?

时间:2014-01-30 20:32:17

标签: delphi opengl c++builder firemonkey

如何计算对象上按下的UV纹理点?

例如:我有一个由地球紫外线地图纹理的球,我按下任何一个城市,我想得到一个关于地球上的城市的命运吗?

我要去尝试解释:) 我有一个代码:

bool    draw;
int     old_position_X;
int     old_position_Y;

void __fastcall TForm1::Image3D(TObject *Sender, TShiftState Shift, float X,
          float Y, TVector3D &RayPos, TVector3D &RayDir)
{
    if (Shift.Contains(ssLeft))
    {
        if (draw==true)
        {
            TVector3D HitPos;
            Image3D->Context->Pick(X, Y, TProjection::pjCamera, RayPos, RayDir);
            RayCastPlaneIntersect(RayPos, RayDir, Image3D->AbsolutePosition, Image3D->AbsoluteDirection, HitPos) ;
            HitPos.X -= Image3D->Position->X;
            HitPos.Y -= Image3D->Position->Y;

            int w=Image3D->Bitmap->Width;
            int h=Image3D->Bitmap->Height;
            int x=(w/Image3D->Width)*(HitPos.X+Image3D->Width/2.0);
            int y=(h/Image3D->Height)*(HitPos.Y+Image3D->Height/2.0);

            Image3D->Bitmap->Canvas->BeginScene();
            Image3D->Bitmap->Canvas->Stroke->Kind=TBrushKind::bkSolid;
            Image3D->Bitmap->Canvas->Stroke->Color=claRed;
            Image3D->Bitmap->Canvas->DrawLine(TPointF(old_position_X,old_position_Y),TPointF(x,y),1.0);
            Image3D->Bitmap->Canvas->EndScene();

            old_position_X=x;
            old_position_Y=y;
        }
    }
    else
    {
        draw=false;
    }

}

我可以缩放,旋转和移动Image3D,那些代码让我在Image3D上画画。

顺便说一句,我不明白为什么我必须将Image3D的宽度和高度除以2,但这可行:)我不明白3D对象值(比例,位置等)和像素之间的依赖关系。特别是刻度X,Y,Z和宽度,3D物体的高度......以及与纹理尺寸和3D物体比例的相关性......

现在,我想在导入的型号上做同样的事情。如何计算纹理上的位置。 我不指望完全代码,但我会要求指导,示例代码等

1 个答案:

答案 0 :(得分:2)

通常的方法是:

  1. 使用光线计算您所击中的三角形。
  2. 获取其三个顶点的UV坐标并进行插值。