游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3566|回复: 9

[求助]大家过年好,我先给大家拜个年。顺便问个问题。

[复制链接]

3

主题

13

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2008-2-6 19:50:00 | 显示全部楼层 |阅读模式
[求助]大家过年好,我先给大家拜个年。顺便问个问题。我写了一段打开3DS文件的程序,程序的大部分都没有错,但是最后的贴图部分出了问题,请帮忙看看,可能是哪里的问题。

这就是渲染一个3DS文件后的截图,程序中可能出错的代码在下边。
///////////////////////////////////////////////////////////////////////////////////////////////////////
CTrimesh::Read(char *pF)
{
        CVector temp_v1,temp_v2,temp_v3;
        iFace=0;

        ID=*((unsigned short int*)pF);
        length=*((unsigned int*)(pF+2));

        char *p;
        p=pF+6;
        while(p<pF+length)
        {
                switch(*((unsigned short int*)p))
                {
                case 0x4110:        // 顶点列表块
                        iVertice=*((unsigned short int*)(p+6));
                        pVertice=new tVertice[iVertice];
                        pNormal=new CFloatVector[iVertice];
                        pTexture=new tTexture[iVertice];
                        for(unsigned int i=0;i<iVertice;i++)
                        {
                                pVertice.x=((float*)(p+8))[i*3];
                                pVertice.z=-((float*)(p+8))[i*3+1];
                                pVertice.y=((float*)(p+8))[i*3+2];
                        }
                        break;
                case 0x4120:        // 面信息块
                        iFace=*((unsigned short int*)(p+6));
                        pFace=new tFace[iFace];
                        for(unsigned int i=0;i<iFace;i++)
                        {
                                pFace.face[0]=*((unsigned short int*)(p+i*8+8));
                                pFace.face[1]=*((unsigned short int*)(p+i*8+10));
                                pFace.face[2]=*((unsigned short int*)(p+i*8+12));
                                temp_v1.x=pVertice[pFace.face[0]].x-pVertice[pFace.face[1]].x;
                                temp_v1.y=pVertice[pFace.face[0]].y-pVertice[pFace.face[1]].y;
                                temp_v1.z=pVertice[pFace.face[0]].z-pVertice[pFace.face[1]].z;
                                temp_v2.x=pVertice[pFace.face[1]].x-pVertice[pFace.face[2]].x;
                                temp_v2.y=pVertice[pFace.face[1]].y-pVertice[pFace.face[2]].y;
                                temp_v2.z=pVertice[pFace.face[1]].z-pVertice[pFace.face[2]].z;
                                temp_v3.CrossVertex(temp_v1,temp_v2);
                                //这里将面的法线累加到三个顶点上。
                                pNormal[pFace.face[0]]+=temp_v3;
                                pNormal[pFace.face[1]]+=temp_v3;
                                pNormal[pFace.face[2]]+=temp_v3;
                        }
                        for(unsigned int i=0;i<iVertice;i++)
                        {
                                pNormal.Normalize();
                        }
                        if(iFace*8+8<*((unsigned int*)(p+2)))
                        {
                                if(*((unsigned short int*)(p+(iFace*8+8)))==0x4130)
                                {
                                        // 一个物体本来可以绑定多种材质的,这里为了省事,只读取第一个材质的名称。
                                        strcpy(MatName,p+(iFace*8+14));
                                }
                        }
                        break;
                case 0x4140:
                        iTexture=*((unsigned short int*)(p+6));
                        for(unsigned int i=0;i<iTexture;i++)
                        {
                                pTexture.u=((float*)(p+8))[i*2];
                                pTexture.v=-((float*)(p+8))[i*2+1];
                        }
                        break;
                }
                p+=*((unsigned int*)(p+2));
        }
        return true;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void CObject::draw()
{
        //启用顶点数组
        glEnableClientState( GL_VERTEX_ARRAY );
        glEnableClientState( GL_NORMAL_ARRAY );
        glVertexPointer( 3, GL_FLOAT, 0, mTrimesh.pVertice );
        glNormalPointer( GL_FLOAT, 0, mTrimesh.pNormal );
        if(mTrimesh.iTexture)
        {
                glEnableClientState( GL_TEXTURE_COORD_ARRAY );
                glTexCoordPointer( 3, GL_FLOAT, 0, mTrimesh.pTexture );
        }
        glDrawElements( GL_TRIANGLES, mTrimesh.iFace*3, GL_UNSIGNED_SHORT, mTrimesh.pFace );
}

3

主题

121

帖子

121

积分

注册会员

Rank: 2

积分
121
QQ
发表于 2008-2-6 21:55:00 | 显示全部楼层

Re:[求助]大家过年好,我先给大家拜个年。顺便问个问题

纹理坐标错误.交换一下纹理坐标的X,Y,Z

3

主题

13

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2008-2-7 11:23:00 | 显示全部楼层

Re: [求助]大家过年好,我先给大家拜个年。顺便问个问题

您好,我又试了一下,结果如图。

麻烦您再想想办法,谢谢您了。

3

主题

121

帖子

121

积分

注册会员

Rank: 2

积分
121
QQ
发表于 2008-2-7 12:09:00 | 显示全部楼层

Re:[求助]大家过年好,我先给大家拜个年。顺便问个问题

你在读取纹理坐标时把v等于负了.试试把其改回正.

3

主题

13

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2008-2-7 12:31:00 | 显示全部楼层

Re:[求助]大家过年好,我先给大家拜个年。顺便问个问题


您好,还是出错。
pTexture.u=((float*)(p+8))[i*2];
pTexture.v=((float*)(p+8))[i*2+1];

pTexture.v=((float*)(p+8))[i*2];
pTexture.u=((float*)(p+8))[i*2+1];

pTexture.u=((float*)(p+8))[i*2];
pTexture.v=-((float*)(p+8))[i*2+1];

pTexture.u=((float*)(p+8))[i*2];
pTexture.v=1-((float*)(p+8))[i*2+1];
我都试过了,和上面的差不多。

3

主题

121

帖子

121

积分

注册会员

Rank: 2

积分
121
QQ
发表于 2008-2-7 14:03:00 | 显示全部楼层

Re:[求助]大家过年好,我先给大家拜个年。顺便问个问题

那就不知啦.上面的代码那样写很容易出错哦.

3

主题

13

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2008-2-7 15:13:00 | 显示全部楼层

Re:[求助]大家过年好,我先给大家拜个年。顺便问个问题

请问,您能不能推荐一些可能能解决问题的文章、贴子、网站?谢谢您了。

3

主题

121

帖子

121

积分

注册会员

Rank: 2

积分
121
QQ
发表于 2008-2-7 16:57:00 | 显示全部楼层

Re: Re:[求助]大家过年好,我先给大家拜个年。顺便问个问

HelloWorld!: Re:[求助]大家过年好,我先给大家拜个年。顺便问个问题。我写了一段打开3DS文件的程序,程序的大部分都没有

请问,您能不能推荐一些可能能解决问题的文章、贴子、网站?谢谢您了。

下来看看吧

sf_200827165719.rar

7.57 KB, 下载次数:

3

主题

13

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2008-2-7 17:22:00 | 显示全部楼层

Re:[求助]大家过年好,我先给大家拜个年。顺便问个问题

好,谢谢您了。

3

主题

13

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2008-2-8 11:58:00 | 显示全部楼层

Re:[求助]大家过年好,我先给大家拜个年。顺便问个问题

谢谢您,程序调试好了。

问题出在这里。
void CObject::draw()
{
        //启用顶点数组
        glEnableClientState( GL_VERTEX_ARRAY );
        glEnableClientState( GL_NORMAL_ARRAY );
        glVertexPointer( 3, GL_FLOAT, 0, mTrimesh.pVertice );
        glNormalPointer( GL_FLOAT, 0, mTrimesh.pNormal );
        if(mTrimesh.iTexture)
        {
                glEnableClientState( GL_TEXTURE_COORD_ARRAY );
                glTexCoordPointer( 2, GL_FLOAT, 0, mTrimesh.pTexture );
        }
        glDrawElements( GL_TRIANGLES, mTrimesh.iFace*3, GL_UNSIGNED_SHORT, mTrimesh.pFace );
}
第一个参数应该是2,我写成了3。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-20 01:15

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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