游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4612|回复: 15

请问Max插件因顶点纹理坐标问题而产生的问题

[复制链接]

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2005-10-27 23:09:00 | 显示全部楼层 |阅读模式
以为单是mesh->getVert(i)没法获得真正的纹理坐标,所以要在mesh的纹理面索引里找出多了的纹理坐标及其队赢得顶点位置,,但却出现了新纹理坐标与顶点坐标不对应的问题。
在正常导出pMesh->getVert(j)后,加入如下代码:
DWORD* NewVerts=new DWORD[pMesh->numTVerts-nVert];
for(j=nVert;j<pMesh->numTVerts;j++)
{
        for(int k=0;k<pMesh->numFaces;k++)
                for(int l=0;l<3;l++)
                        if(pMesh->tvFace[k].t[l]==j)
                        {
                                Point3 ver=pMesh->getVert(j==nVert?pMesh->faces[k].v[l]-2:pMesh->faces[k].v[l])*tm;
                                file<<ver.x<<" "<<ver.z<<" "<<ver.y<<" ";
                                UVVert uv=pMesh->tVerts[j];
                                uv=uv*tmUV;
                                file<<uv.x <<" "<<1-uv.y<<" ";
                                D3DXVECTOR3 nor;
                                D3DXVec3Normalize(&nor,(D3DXVECTOR3*)&pMesh->getNormal(pMesh->faces[k].v[l]));
                                file<<nor.x<<" "<<nor.z<<" "<<nor.y<<" "<<endl;

                                NewVerts[j-nVert]=pMesh->faces[k].v[l];
                                goto _temp;
                        }
_temp:
                                                        ;
}

面索引的导出:
for(DWORD j=0;j<nFace;j++)
        if( bSwapTriOrder )
                file<<pMesh->tvFace[j].t[0]<<" "<<pMesh->tvFace[j].t[1]<<" "<<pMesh->tvFace[j].t[2]<<" "<<endl;


代码应该不长,也许看一看就会知道问题所在了,但我无论怎样调试也找不出[em10]。。。。请教。[em24]

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
发表于 2005-10-28 09:09:00 | 显示全部楼层

Re:请问Max插件因顶点纹理坐标问题而产生的问题

纹理坐标与顶点坐标不对应是什么意思?

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-10-28 12:48:00 | 显示全部楼层

Re:请问Max插件因顶点纹理坐标问题而产生的问题

就是A顶点有两个纹理坐标(1,0)和(0,1),这样就需要导出这个顶点两次(A1、A2),每次的纹理坐标都不同,但A1顶点导出后它的纹理坐标正常,A2的纹理坐标就不是(0,1)了

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-10-30 14:25:00 | 显示全部楼层

Re:请问Max插件因顶点纹理坐标问题而产生的问题

6

主题

90

帖子

90

积分

注册会员

Rank: 2

积分
90
发表于 2005-11-1 14:02:00 | 显示全部楼层

Re:请问Max插件因顶点纹理坐标问题而产生的问题

不知道你怎么想的,这样不就好了...
for(int i=0; i < pMesh->numFaces; k++ )
{
int vi1 = pMesh->faces[ i ].v[ 0 ];
int vi2 = pMesh->faces[ i ].v[ 0 ];
int vi3 = pMesh->faces[ i ].v[ 0 ];

int ti1 = pMesh->tvFace[ i ].t[ 0 ];
int ti2 = pMesh->tvFace[ i ].t[ 0 ];
int ti3 = pMesh->tvFace[ i ].t[ 0 ];

Point3 v1 = pMesh.getVert( vi1 );
Point3 v2 = pMesh.getVert( vi2 );
Point3 v3 = pMesh.getVert( vi3 );

UVVert t1 = pMesh.getTVert( ti1 );
UVVert t2 = pMesh.getTVert( ti2 );
UVVert t3 = pMesh.getTVert( ti3 );

// do something with v1/t1, v2/t2, v3/t3
}
抛开逻辑不谈,你的代码风格也太诡异了

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-11-1 18:02:00 | 显示全部楼层

Re:请问Max插件因顶点纹理坐标问题而产生的问题

这样就不需要索引了,恐怕会令导出的数据多很多

6

主题

90

帖子

90

积分

注册会员

Rank: 2

积分
90
发表于 2005-11-1 18:21:00 | 显示全部楼层

Re:请问Max插件因顶点纹理坐标问题而产生的问题

那这么写:
for(int i=0; i < pMesh->numFaces; i++ )
{
int vi1 = pMesh->faces[ i ].v[ 0 ];
int vi2 = pMesh->faces[ i ].v[ 0 ];
int vi3 = pMesh->faces[ i ].v[ 0 ];

int ti1 = pMesh->tvFace[ i ].t[ 0 ];
int ti2 = pMesh->tvFace[ i ].t[ 0 ];
int ti3 = pMesh->tvFace[ i ].t[ 0 ];
// write vi1/ti1, vi2/ti2, vi3/ti3
}

for(int i=0; i < pMesh->numVerts; i++ )
{
Point3 v1 = pMesh->getVert(i);
Point3 v2 = pMesh->getVert(i);
Point3 v3 = pMesh->getVert(i);
// write v1,v2,v3
}

for(int i=0; i < pMesh->numTVerts; i++ )
{
UVVert t1 = pMesh->getTVert(i);
UVVert t2 = pMesh->getTVert(i);
UVVert t3 = pMesh->getTVert(i);
// write t1,t2,t3
}
纹理坐标的总数和顶点的总数并不相等,对它们使用的索引也是分开的。
你的代码里这句话最让我困惑
if( pMesh->tvFace[k].t[l] == j )

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-11-2 11:26:00 | 显示全部楼层

Re:请问Max插件因顶点纹理坐标问题而产生的问题

不对........你这样的数据更大了,而且使用更为不便了........有没有 顶点分裂 的方法?

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-11-3 12:45:00 | 显示全部楼层

Re:请问Max插件因顶点纹理坐标问题而产生的问题

还有你的代码有问题:
int vi1 = pMesh->faces[ i ].v[ 0 ];
int vi2 = pMesh->faces[ i ].v[ 0 ];
int vi3 = pMesh->faces[ i ].v[ 0 ];
这三行有区别吗?

6

主题

90

帖子

90

积分

注册会员

Rank: 2

积分
90
发表于 2005-11-4 15:16:00 | 显示全部楼层

Re:请问Max插件因顶点纹理坐标问题而产生的问题

靠,笔误笔误,复制的时候昏头了,不好意思
for(int i=0; i < pMesh->numFaces; i++ )
{
int vi1 = pMesh->faces[ i ].v[ 0 ];
int vi2 = pMesh->faces[ i ].v[ 1 ];
int vi3 = pMesh->faces[ i ].v[ 2 ];

int ti1 = pMesh->tvFace[ i ].t[ 0 ];
int ti2 = pMesh->tvFace[ i ].t[ 1 ];
int ti3 = pMesh->tvFace[ i ].t[ 2 ];
// write vi1/ti1, vi2/ti2, vi3/ti3
}

for(int i=0; i < pMesh->numVerts; i++ )
{
Point3 v = pMesh->getVert(i);
// write v
}

for(int i=0; i < pMesh->numTVerts; i++ )
{
UVVert t = pMesh->getTVert(i);
// write t
}

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-17 00:51

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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