游戏开发论坛

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

3dmax sdk插件的纹理坐标问题,请教各位一下.

[复制链接]

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
发表于 2009-2-5 17:10:00 | 显示全部楼层 |阅读模式
我的插件坐标关系
dx_x = max_x
dx_y = max_z
dx_z = max_y
dx_tu = max_tu
dx_tv = 1-max_tv
但显示不正常
在3DMAX 中如图
sf_20092517942.jpg

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
 楼主| 发表于 2009-2-5 17:11:00 | 显示全部楼层

Re: 3dmax sdk插件的纹理坐标问题,请教各位一下.

在D3D 中如图

sf_200925171034.jpg

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
 楼主| 发表于 2009-2-5 17:12:00 | 显示全部楼层

Re: 3dmax sdk插件的纹理坐标问题,请教各位一下.

简单的物体如下面的树木,好象可以
如图,为什么???
sf_200925171220.jpg

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
 楼主| 发表于 2009-2-5 17:15:00 | 显示全部楼层

Re: 3dmax sdk插件的纹理坐标问题,请教各位一下.

输出的代码

bool ExportMesh(NodeItem & Node, FILE *out)   
{   
    INode * pNode = Node.pNode;   
    if ((!pNode)||(!IsMesh(pNode))) return false;   
   
    //写入材质信息   
    Mtl * pMtl = pNode->GetMtl();   
    if (!pMtl)  // No material assigned   
    {   
        Node.Mesh.bUseMat = false;   
    }   
    else        // Material assigned   
    {   
        Node.Mesh.bUseMat = true;   
        // See if it's a Standard material   
   
        if (pMtl->ClassID() == Class_ID(DMTL_CLASS_ID, 0))   
        {   
            // We're going to use the 'Diffuse' color as the object color for DirectX   
            Node.Mesh.Diff_r = pMtl->GetDiffuse().r;   
            Node.Mesh.Diff_g = pMtl->GetDiffuse().g;   
            Node.Mesh.Diff_b = pMtl->GetDiffuse().b;   
            //Alpha   
            Node.Mesh.Diff_a = 1.0f - pMtl->GetXParency();   
            // Access the Diffuse map and see if it's a Bitmap texture   
   
            Texmap *tmap = pMtl->GetSubTexmap(ID_DI);   
            if ( (tmap != NULL) && (tmap->ClassID() == Class_ID(BMTEX_CLASS_ID, 0)) )   
            {   
                FindTextureFilename texfilename;   
                Node.Mesh.Diff_r = 1.0f;   
                Node.Mesh.Diff_g = 1.0f;   
                Node.Mesh.Diff_b = 1.0f;   
                Node.Mesh.Diff_a = 1.0f;   
                tmap->EnumAuxFiles(texfilename, FILE_ENUM_ALL);   
   
                if (texfilename.m_szTextureName != NULL)    // texture filename found   
                {   
                    GetFileName(texfilename.m_szTextureName);

                    strcpy(Node.Mesh.TexFile,texfilename.m_szTextureName);   
                }   
            }   
        }   
    }   
      // Matrix3 tm=pNode->GetObjTMAfterWSM(0); lzp

     Matrix3 tm = pNode->GetObjectTM(0);   
    ObjectState os = pNode->EvalWorldState(0);   
    int needDel;   
    Mesh& mesh =*(((GeomObject*) os.obj)->GetRenderMesh(0,pNode,nullView,needDel));   
      
   
    //===============================================================   
    // write the mesh vertices   
    Node.Mesh.vertCnt = mesh.getNumVerts();   
    Node.Mesh.vertOfs = ftell(out);   
    for(int i = 0; i < Node.Mesh.vertCnt; i++)   
    {   
        Point3 pnt = mesh.getVert(i) * tm;          //premultiply in MAX   
        MAXtoD3D(pnt);                              //D3D useful coordinate transformation   
        fwrite(&pnt.x, sizeof(float), 3, out);   
    }   
   
    // write vertex normals   
    mesh.buildNormals();   
    Node.Mesh.normCnt = mesh.getNumVerts();   
    Node.Mesh.normOfs = ftell(out);   
    for(int i = 0; i < Node.Mesh.normCnt; i++)   
    {   
        // normals are taken from a unique smoothing group   
        Point3 norm = Normalize(mesh.getNormal(i));   
        MAXtoD3D(norm);   
        fwrite(&norm.x, sizeof(float), 3, out);   
    }   
   
    // write texture vertex   
      
    Node.Mesh.tvertCnt = mesh.getNumTVerts();   
    Node.Mesh.tvertOfs = ftell(out);   
    for(int i = 0; i < Node.Mesh.tvertCnt; i++)   
    {   
        UVVert uv = mesh.getTVert(i);  
                uv.y=1.0f-uv.y;
        fwrite(&uv.x, sizeof(float), 2, out);   
    }   
   
    // build and write faces   
    Node.Mesh.faceCnt = mesh.getNumFaces();   
    Node.Mesh.faceOfs = ftell(out);   
    for(int i = 0; i < Node.Mesh.faceCnt; i++)   
    {   
        SGEFace_hdr fHdr;   
        memset(&fHdr, 0, sizeof(SGEFace_hdr));   
   
        fHdr.vert[0] = mesh.faces.v[0];   
        fHdr.vert[1] = mesh.faces.v[1];   
        fHdr.vert[2] = mesh.faces.v[2];   
        // TODO: insert normals   
        fwrite(&fHdr, sizeof(SGEFace_hdr), 1, out);   
    }   
   
    return true;   
}   
   

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2009-2-6 13:55:00 | 显示全部楼层

Re: 3dmax sdk插件的纹理坐标问题,请教各位一下.

是不是在程序里设置了uvwrap ??看样子地板的uv应该是循环的(uv>1),但你在程序里面仿佛是clamp到了0~1之间。

3

主题

84

帖子

84

积分

注册会员

Rank: 2

积分
84
发表于 2009-2-6 18:04:00 | 显示全部楼层

Re:3dmax sdk插件的纹理坐标问题,请教各位一下.

我估计是这样,同一个NODE可能使用两个以上的贴图,
所以要自己把同一个NODE中使用不同贴图的的三角形分成不同的网格,
每次绘制一组网格的时候,肯定都只能使用一种贴图和材质

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2009-2-6 19:03:00 | 显示全部楼层

Re: Re:3dmax sdk插件的纹理坐标问题,请教各位一下.

kalu169: Re:3dmax sdk插件的纹理坐标问题,请教各位一下.

我估计是这样,同一个NODE可能使用两个以上的贴图,
所以要自己把同一个NODE中使用不同贴图的的三角形分成不同的网格,
每次绘制一组网格的时候,肯定都只能使用一种贴图和材质

如果一个node使用了两张以上的贴图,那起码它的图有一部分是对的,但看样子房子上的图是完错,不是部分错误。

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
 楼主| 发表于 2009-2-7 07:19:00 | 显示全部楼层

Re:3dmax sdk插件的纹理坐标问题,请教各位一下.

谢谢各位,两贴图如何处理?

89

主题

4036

帖子

4132

积分

论坛元老

Rank: 8Rank: 8

积分
4132
发表于 2009-2-7 18:36:00 | 显示全部楼层

Re:3dmax sdk插件的纹理坐标问题,请教各位一下.

1.没乘UV Transform Matrix.
2.可能是图片文件自己上下翻了。就是你读贴图的代码错了。

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
 楼主| 发表于 2009-2-8 00:53:00 | 显示全部楼层

Re: 3dmax sdk插件的纹理坐标问题,请教各位一下.

楼上的老大能提供代码么?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 09:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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