游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1252|回复: 0

有没人解析过M2文件或看过本站的解析代码,求教个问题~

[复制链接]

20

主题

56

帖子

56

积分

注册会员

Rank: 2

积分
56
发表于 2007-9-24 23:07:00 | 显示全部楼层 |阅读模式
(D3D新手)
Q1:m2 use a Z-up coordinate systems, so in order to convert to Y-up, the X, Y, Z values become (X, -Z, Y). 这个是M2文档的一个说明

之后在看 wowmodelview-0.48b-src(本站有下)//在OPENGL下

//下面是提取骨骼变换距阵的平移,缩放,旋转数据
Vec3D fixCoordSystem(Vec3D v)//针对平移
{
        return Vec3D(v.x, v.z, -v.y);
}

Vec3D fixCoordSystem2(Vec3D v)//针对缩放
{
        return Vec3D(v.x, v.z, v.y);
}

Quaternion fixCoordSystemQuat(Quaternion v)//旋转
{
        return Quaternion(-v.x, -v.z, v.y, v.w);
}
是转换函数  我想问下这个转换关系
就是对于这三个数据进行的是什么样的处理,以前我都是直接用的。
另外我现在用D3D做,就得换到左手坐标系,暂不清楚如何转换~
请高手指点相关内容,或者我遗漏了什么知识点去学习。


Q2 :-------pivot 是个什么数据??
在下面的程序中m.translation(pivot);   m *= Matrix::newTranslation(pivot*-1.0f);
的操作不是等于没有操作?

if (tr) {
                m.translation(pivot);
               
                if (trans.used) {
                        Vec3D tr = trans.getValue(anim, time);
                        m *= Matrix::newTranslation(tr);
                }

                if (rot.used && rotate) {
                        q = rot.getValue(anim, time);
                        m *= Matrix::newQuatRotate(q);
                }

                if (scale.used) {
                        Vec3D sc = scale.getValue(anim, time);
                        m *= Matrix::newScale(sc);
                }

                if (billboard) {
                        Matrix mtrans;
                        glGetFloatv(GL_MODELVIEW_MATRIX, &(mtrans.m[0][0]));
                        mtrans.transpose();
                        mtrans.invert();
                        Vec3D camera = mtrans * Vec3D(0.0f,0.0f,0.0f);
                        Vec3D look = (camera - pivot).normalize();

                        Vec3D up = ((mtrans * Vec3D(0.0f,1.0f,0.0f)) - camera).normalize();
                        // these should be normalized by default but fp inaccuracy kicks in when looking down
                        Vec3D right = (up % look).normalize();
                        up = (look % right).normalize();

                        // calculate a billboard matrix
                        Matrix mbb;
                        mbb.unit();
                        //mbb.m[0][2] = right.x;
                        //mbb.m[1][2] = right.y;
                        //mbb.m[2][2] = right.z;
                        mbb.m[3][2] = 0.0f;
                        mbb.m[0][1] = up.x;
                        mbb.m[1][1] = up.y;
                        mbb.m[2][1] = up.z;
                        mbb.m[3][1] = 0.0f;
                        //mbb.m[0][0] = look.x;
                        //mbb.m[1][0] = look.y;
                        //mbb.m[2][0] = look.z;
                        mbb.m[3][0] = 0.0f;
                        /*
                        mbb.m[0][2] = right.x;
                        mbb.m[1][2] = right.y;
                        mbb.m[2][2] = right.z;
                        mbb.m[0][1] = up.x;
                        mbb.m[1][1] = up.y;
                        mbb.m[2][1] = up.z;
                        mbb.m[0][0] = look.x;
                        mbb.m[1][0] = look.y;
                        mbb.m[2][0] = look.z;
                        */
                        m *= mbb;
                }

                m *= Matrix::newTranslation(pivot*-1.0f);
               
        } else m.unit();

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

本版积分规则

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

GMT+8, 2025-6-21 10:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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