游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1975|回复: 5

求纹理映谢的算法

[复制链接]

2

主题

4

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2006-12-10 12:34:00 | 显示全部楼层 |阅读模式
已知空间模型mesh的一个面上三个顶点的世界坐标(x.y,z)和这个三个顶点的纹理坐标(uv),,求在这个三角面内的一个已知道世界坐标(x,y,z)的点相对应的纹理坐标(UV).

最好是求算法,,不求在dX中用函数实现

谢谢大家..

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2006-12-10 18:50:00 | 显示全部楼层

Re:求纹理映谢的算法

可看一下“计算机图形学”

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2006-12-10 21:31:00 | 显示全部楼层

Re:求纹理映谢的算法

先计算三角面的切向量T和副法线B,然后计算已知点在面的T、B方向最值之间的比例,插值就行了

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2006-12-11 11:34:00 | 显示全部楼层

Re:求纹理映谢的算法

直接插值就行了。

190

主题

1801

帖子

2096

积分

金牌会员

Rank: 6Rank: 6

积分
2096
QQ
发表于 2006-12-11 20:15:00 | 显示全部楼层

Re:求纹理映谢的算法

//build texture properties
                int fp_u1=0,fp_v1=0;
                int fp_dyu=0, fp_dyv=0, fp_dxu=0, fp_dxv=0;
                int currentTexelIndex=0, textureWidth=0 , textureHeight=0;
                if(texture2DEnable)
                {
                        fp_u1=pointProperties[currentPointBufferIndex][vertexIndex0*2+0+1];//<<16;
                        fp_v1=pointProperties[currentPointBufferIndex][vertexIndex0*2+1+1];//<<16;
                        int fp_u2=pointProperties[currentPointBufferIndex][vertexIndex1*2+0+1];//<<16;
                        int fp_v2=pointProperties[currentPointBufferIndex][vertexIndex1*2+1+1];//<<16;
                        int fp_u3=pointProperties[currentPointBufferIndex][vertexIndex2*2+0+1];//<<16;
                        int fp_v3=pointProperties[currentPointBufferIndex][vertexIndex2*2+1+1];//<<16;
                        System.out.print("textuetest, fp_u1="+fp_u1);
                        System.out.println(" , fp_v1="+fp_v1+" x1="+x1+" y1="+y1);
                        System.out.print("textuetest, fp_u2="+fp_u2);
                        System.out.println(" , fp_v2="+fp_v2+" x2="+x2+" y2="+y2);
                        System.out.print("textuetest, fp_u3="+fp_u3);
                        System.out.println(" , fp_v3="+fp_v3+" x3="+x3+" y3="+y3);
                        /*
                        int fp_dxab,fp_dyab,fp_dxbc,fp_dybc,fp_dxca,fp_dyca;
                       
                        int fp_duab,fp_dvab,fp_dubc,fp_dvbc,fp_duca,fp_dvca;
                       
                        fp_dxab=GETFP(x2-x1);
                        fp_dyab=GETFP(y2-y1);
                       
                        fp_dxbc=GETFP(x3-x2);
                        fp_dybc=GETFP(y3-y2);
                       
                        fp_dxca=GETFP(x1-x3);
                        fp_dyca=GETFP(y1-y3);
                       
                        fp_duab=fp_u2-fp_u1;
                        fp_dvab=fp_v2-fp_v1;
                       
                        fp_dubc=fp_u3-fp_u2;
                        fp_dvbc=fp_v3-fp_v2;
                       
                        fp_duca=fp_u1-fp_u3;
                        fp_dvca=fp_v1-fp_v3;
                       
                        //int fp_dyu, fp_dyv, fp_dxu, fp_dxv;
                       
                       
                        fp_dyu=FPDIV((FPMUL(fp_duab,fp_dxbc)-FPMUL(fp_dubc,fp_dxab)),(FPMUL(fp_dyab,fp_dxbc)-FPMUL(fp_dybc,fp_dxab)));
                        fp_dyv=FPDIV((FPMUL(fp_dvab,fp_dxbc)-FPMUL(fp_dvbc,fp_dxab)),(FPMUL(fp_dyab,fp_dxbc)-FPMUL(fp_dybc,fp_dxab)));
                       
                        fp_dxu=FPDIV((fp_duab-FPMUL(fp_dyu,fp_dyab)),fp_dxab);
                        fp_dxv=FPDIV((fp_dvab-FPMUL(fp_dyv,fp_dyab)),fp_dxab);
                        */
                       
                        if (((y2-y1)*(x3-x1) - (x2-x1)*(y3-y1))!=0)
                        {
                                fp_dyu= ((fp_u2-fp_u1)*(x3-x1) - (fp_u3-fp_u1)*(x2-x1))/ ((y2-y1)*(x3-x1) - (x2-x1)*(y3-y1));
                                fp_dyv= ((fp_v2-fp_v1)*(x3-x1) - (fp_v3-fp_v1)*(x2-x1))/ ((y2-y1)*(x3-x1) - (x2-x1)*(y3-y1));
                               
                                System.out.print("textuetest, dxu="+fp_dxu);
                                System.out.println(", dxv="+fp_dxv);
                        }else
                        {
                                System.out.print("0 error0");
                        }
                        /* else
                        System.out.println("not right1"); */
                        if((x2-x1)!=0)
                        {
                                fp_dxu= ((fp_u2-fp_u1)-(y2-y1)*fp_dyu)/(x2-x1);
                                fp_dxv= ((fp_v2-fp_v1)-(y2-y1)*fp_dyv)/(x2-x1);
                               
                                System.out.print("textuetest, dyu="+fp_dyu);
                                System.out.println(", dyv="+fp_dyv);
                        }else
                        {
                                System.out.print("0 error1");
                        }
                       
                       
                        //end of build texture properties build
                        currentTexelIndex=pointProperties[currentPointBufferIndex][0]-TEXTURE_2D;
                       
                        textureWidth=textureObject[currentTexelIndex * TEXTURE_OBJECT_ALL +TEXTURE_OBJECT_WIDTH];//texture.getWidth();
                        textureHeight=textureObject[currentTexelIndex * TEXTURE_OBJECT_ALL +TEXTURE_OBJECT_HEIGHT];//texture.getHeight();
                }

......

if(texture2DEnable)
                                                        {
                                                               
                                                                //m is x
                                                                int fp_u,fp_v;
                                                                fp_u=textureTestBetween0to1(((m-x1)*fp_dxu) +((y-y1)*fp_dyu) + fp_u1);
                                                                fp_v=textureTestBetween0to1(((m-x1)*fp_dxv) +((y-y1)*fp_dyv )+fp_v1);
                                                               
                                                                 // System.out.println("fp_u="+fp_u);
                                                                // System.out.println("fp_v="+fp_v);
                                                /*                 try{
                                                                        Thread.sleep(200);       
                                                                }catch(Exception xxx){} */
                                                               
                                                               
                                                                int ui=GETINT(FPMUL(GETFP(textureWidth),fp_u));
                                                                int vi=GETINT(FPMUL(GETFP(textureHeight),fp_v));
                                                               
                                                                if(ui==textureWidth)
                                                                {
                                                                        ui--;
                                                                }
                                                               
                                                                if(vi==textureWidth)
                                                                {
                                                                        vi--;
                                                                }
                                                               
                                                                // System.out.println("ui="+ui);
                                                                // System.out.println("vi="+vi);
                                                                int color=texelBuffer[currentTexelIndex][(ui)+(vi)*textureWidth];//textureData[ui+vi*textureWidth];
                                                                // if((color&0x00ffffff)==0xffffff)
                                                                // {
                                                                        // System.out.println("error coolor="+0xffffffff);
                                                                // }
                                                                //System.out.println(color);
                                                                if((color&0xff000000)==0xff000000)
                                                                        setPexel(m,y,(color&0x00ffffff));
                                                                // sout("fillTriangle color ok");
                                                                /*
                                                                textureTest(x1,y1,
                                                                x2,y2,
                                                                x3,y3,
                                                                textureCoordinate[vertexIndex0*2+0], textureCoordinate[vertexIndex0*2+1],
                                                                textureCoordinate[vertexIndex1*2+0], textureCoordinate[vertexIndex1*2+1],
                                                                textureCoordinate[vertexIndex2*2+0], textureCoordinate[vertexIndex2*2+1],
                                                                textureData,
                                                                m,y);
                                                                */
                                                        }

不保证准确。。。我用的不是指数性浮点数

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2006-12-12 10:49:00 | 显示全部楼层

Re:求纹理映谢的算法

楼上最后一句话才是经典。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 02:00

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表