游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1947|回复: 4

openg 旋转的问题

[复制链接]

8

主题

19

帖子

23

积分

注册会员

Rank: 2

积分
23
发表于 2007-5-15 10:51:00 | 显示全部楼层 |阅读模式
int  TDube::Get_TwoCmpValue(const float Temp_f1 , const float Temp_f2)
{
        float T_f1,T_f2;

        int  Ret_Value;

        T_f1=Temp_f1;
        T_f2=Temp_f2;

        if ((T_f1==0)&&(T_f2>0))
                Ret_Value=0;
        else if ((T_f1==0)&&(T_f2==0))
                Ret_Value=1;
        else if ((T_f1==0)&&(T_f2<0))
                Ret_Value=2;

        else if ((T_f1>0)&&(T_f2>0))
                Ret_Value=3;
        else if ((T_f1>0)&&(T_f2==0))
                Ret_Value=4;
        else if ((T_f1>0)&&(T_f2>0))
                Ret_Value=5;

        else if ((T_f1<0)&&(T_f2>0))
                Ret_Value=6;
        else if ((T_f1<0)&&(T_f2==0))
                Ret_Value=7;
        else if ((T_f1<0)&&(T_f2<0))
                Ret_Value=8;

        return  Ret_Value;

}
//把AB直线旋转到OX轴上
RotateAngle  TDube::Get_LineRotateAngle(VtxPoint Point_A , VtxPoint Point_B)
{
        RotateAngle  RetRotateAngle;
        VtxPoint     C,B;
        float        TempAngle;
        int Temp_Swt;

        C.x=Point_B.x - Point_A.x;
        C.y=Point_B.y - Point_A.y;
        C.z=Point_B.z - Point_A.z;
        C.r=Point_B.r;

        B.x=B.y=B.z=0.0f;
        B.r=Point_B.r;

        if (C.x!=0)
                TempAngle = atan(fabs(C.y)/fabs(C.x))*180.0f/PIE;

        Temp_Swt=Get_TwoCmpValue(C.x,C.y);                //把BC旋转到OXZ平面
        switch(Temp_Swt)
        {
                case 0:                RetRotateAngle.Z_Offset=270;                break;
                case 1:                RetRotateAngle.Z_Offset=0;                break;
                case 2:                RetRotateAngle.Z_Offset=90;                break;
                case 3:                RetRotateAngle.Z_Offset=360-TempAngle;        break;
                case 4:                RetRotateAngle.Z_Offset=0;                break;
                case 5:                RetRotateAngle.Z_Offset=TempAngle;        break;
                case 6:                RetRotateAngle.Z_Offset=180+TempAngle;     break;
                case 7:                RetRotateAngle.Z_Offset=180;                break;
                case 8:                RetRotateAngle.Z_Offset=180-TempAngle;        break;
                default : break;
        }

        C=RotaZ(C,RetRotateAngle.Z_Offset);

        if (C.x!=0)
                TempAngle = atan(fabs(C.z)/fabs(C.x))*180.0f/PIE;

        Temp_Swt=Get_TwoCmpValue(C.x,C.z);

        switch(Temp_Swt)
        {
                case 0:                RetRotateAngle.Y_Offset=90;             break;
                case 1:                RetRotateAngle.Y_Offset=0;                   break;
                case 2:                RetRotateAngle.Y_Offset=270;                break;
                case 3:                RetRotateAngle.Y_Offset=TempAngle;        break;
                case 4:                RetRotateAngle.Y_Offset=0;                break;
                case 5:                RetRotateAngle.Y_Offset=360-TempAngle;        break;
                case 6:                RetRotateAngle.Y_Offset=180-TempAngle;        break;
                case 7:                RetRotateAngle.Y_Offset=180;                break;
                case 8:                RetRotateAngle.Y_Offset=180+TempAngle;        break;
/*
                case 3:                RetRotateAngle.Y_Offset=360-TempAngle;     break;
                case 4:                RetRotateAngle.Y_Offset=0;                break;
                case 5:                RetRotateAngle.Y_Offset=TempAngle;        break;
                case 6:                RetRotateAngle.Y_Offset=180+TempAngle;        break;
                case 7:                RetRotateAngle.Y_Offset=180;                break;
                case 8:                RetRotateAngle.Y_Offset=180-TempAngle;        break;*/
                default : break;
        }

        RetRotateAngle.X_Offset = 0.0f ; //atan(C.z/C.y)*180/PIE;

        return  RetRotateAngle;
}


//把ABC 旋转到OXY平面,把AB直线旋转到OX轴上 ,A为坐标原点,C点在AB的逆时针方向
//                                            圆心               切点             切点
RotateAngle  TDube::Get_ArcRotateAngle(VtxPoint Point_A , VtxPoint Point_B , VtxPoint Point_C)
{
        RotateAngle  RetRotateAngle;
        VtxPoint     B,C,D;
        float        TempAngle;
        int Temp_Swt;


        C.x=Point_B.x - Point_A.x;
        C.y=Point_B.y - Point_A.y;
        C.z=Point_B.z - Point_A.z;
        C.r=Point_B.r;

        D.x=Point_C.x - Point_A.x;
        D.y=Point_C.y - Point_A.y;
        D.z=Point_C.z - Point_A.z;
        D.r=Point_C.r;

        B.x=B.y=B.z=0;
        B.r=Point_A.r;

        if (C.x!=0)
                TempAngle = atan(fabs(C.y)/fabs(C.x))*180.0f/PIE;
        Temp_Swt=Get_TwoCmpValue(C.x,C.y);                //把BC旋转到OXZ平面  B为圆心
        switch(Temp_Swt)
        {
                case 0:                RetRotateAngle.Z_Offset=270;                break;
                case 1:                RetRotateAngle.Z_Offset=0;                break;
                case 2:                RetRotateAngle.Z_Offset=90;                break;
                case 3:                RetRotateAngle.Z_Offset=360-TempAngle;        break;
                case 4:                RetRotateAngle.Z_Offset=0;                break;
                case 5:                RetRotateAngle.Z_Offset=TempAngle;        break;                           case 6:                RetRotateAngle.Z_Offset=180+TempAngle;        break;
                case 7:                RetRotateAngle.Z_Offset=180;                break;
                case 8:                RetRotateAngle.Z_Offset=180-TempAngle;        break;
                default : break;
        }

//        C=RotaZ(C,RetRotateAngle.Z_Offset);
//        D=RotaZ(D,RetRotateAngle.Z_Offset);

        if (C.x!=0)                                                        //把BC旋转到OX轴的正向  B为圆心
                TempAngle = atan(fabs(C.z)/fabs(C.x))*180.0f/PIE;

        Temp_Swt=Get_TwoCmpValue(C.x,C.z);

        switch(Temp_Swt)
        {
                case 0:                RetRotateAngle.Y_Offset=90;                break;
                case 1:                RetRotateAngle.Y_Offset=0;                break;
                case 2:                RetRotateAngle.Y_Offset=270;                break;
                case 3:                RetRotateAngle.Y_Offset=TempAngle;        break;
                case 4:                RetRotateAngle.Y_Offset=0;                break;
                case 5:                RetRotateAngle.Y_Offset=360-TempAngle;        break;
                case 6:                RetRotateAngle.Y_Offset=180-TempAngle;        break;
                case 7:                RetRotateAngle.Y_Offset=180;                break;
                case 8:                RetRotateAngle.Y_Offset=180+TempAngle;        break;
        }
        RetRotateAngle.Y_Offset=RetRotateAngle.Y_Offset;
//        C=RotaY(C,RetRotateAngle.Y_Offset);
//        D=RotaY(D,RetRotateAngle.Y_Offset);

        if (D.y!=0)                                                //把D点旋转到BC 的逆时针方向  //OXY
                TempAngle = atan(fabs(D.z)/fabs(D.y))*180.0f/PIE;

        Temp_Swt=Get_TwoCmpValue(D.y,D.z);

        switch(Temp_Swt)
        {
                case 0:                RetRotateAngle.X_Offset=270;                break;
                case 1:                RetRotateAngle.X_Offset=0;                break;
                case 2:                RetRotateAngle.X_Offset=90;                break;
                case 3:                RetRotateAngle.X_Offset=360-TempAngle;        break;
                case 4:                RetRotateAngle.X_Offset=0;                break;
                case 5:                RetRotateAngle.X_Offset=TempAngle;        break;
                case 6:                RetRotateAngle.X_Offset=180-TempAngle;        break;
                case 7:                RetRotateAngle.X_Offset=180;                break;
                case 8:                RetRotateAngle.X_Offset=180+TempAngle;        break;
                default : break;
        }

        return  RetRotateAngle;
}


现在我想把两点AB 旋转到OX轴的正向,就是这个函数Get_LineRotateAngle
然后把ABC三点旋转到0XY平面, A 为圆心,AB 为OX 的正向,C 点在AB的逆时针方向,就是 Get_ArcRotateAngle函数


现在始终不对,请问大侠,那里有问题,该如何修改

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
发表于 2007-5-15 21:40:00 | 显示全部楼层

Re:openg 旋转的问题

我未看到一句OPENGL的东西。

8

主题

19

帖子

23

积分

注册会员

Rank: 2

积分
23
 楼主| 发表于 2007-5-16 08:56:00 | 显示全部楼层

Re:openg 旋转的问题

上面是计算旋转角度的

8

主题

19

帖子

23

积分

注册会员

Rank: 2

积分
23
 楼主| 发表于 2007-5-16 08:58:00 | 显示全部楼层

Re:openg 旋转的问题

然后根据计算出来的角度旋转的,但,现在不对,我想大家是怎么计算,或者看看我那里计算有问题,请大侠帮帮忙

8

主题

19

帖子

23

积分

注册会员

Rank: 2

积分
23
 楼主| 发表于 2007-5-16 15:25:00 | 显示全部楼层

Re:openg 旋转的问题

大侠路过看看,

上面是我计算 直线旋转到OX轴 和平面旋转到OXY平面的程序,大侠们有没有什么好的建议或方法

说话,我这样计算那里不正确的了,请大家帮帮忙把  急急急!!!!!!!!!!!!!!!!!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 10:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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