资源简介

Qt Creator+opengl实现鼠标交互,控制模型任意旋转,实现轨迹球,
里面的void Widget::drawarrow(GLdouble x0, GLdouble y0, GLdouble z0, GLdouble x1, GLdouble y1, GLdouble z1)这个函数实现,空间任意两点绘制箭头的。

资源截图

代码片段和文件信息

#include 
#include “ArcBall.h“

//轨迹球参数:
//直径                    2.0f
//半径                    1.0f
//半径平方                1.0f
void ArcBall_t::_mapToSphere(const Point2fT* NewPt Vector3fT* NewVec) const
{
    Point2fT TempPt;
    GLfloat length;

    //复制到临时变量
    TempPt = *NewPt;

    //把长宽调整到[-1 ... 1]区间
    TempPt.s.X  = (TempPt.s.X * this->AdjustWidth)  - 1.0f;
    TempPt.s.Y  = 1.0f - (TempPt.s.Y * this->AdjustHeight);

    //计算长度的平方
    length = (TempPt.s.X * TempPt.s.X) + (TempPt.s.Y * TempPt.s.Y);

    //如果点映射到球的外面
    if (length > 1.0f)
    {
        GLfloat norm;

        //缩放到球上
        norm = 1.0f / FuncSqrt(length);

        //设置z坐标为0
        NewVec->s.X = TempPt.s.X * norm;
        NewVec->s.Y = TempPt.s.Y * norm;
        NewVec->s.Z = 0.0f;

    }
    //如果在球内
    else
    {
        //利用半径的平方为1求出z坐标
        NewVec->s.X = TempPt.s.X;
        NewVec->s.Y = TempPt.s.Y;
        NewVec->s.Z = FuncSqrt(1.0f - length);
    }
}

ArcBall_t::ArcBall_t(GLfloat NewWidth GLfloat NewHeight)
{
    this->StVec.s.X     =0.0f;
    this->StVec.s.Y     = 0.0f;
    this->StVec.s.Z     = 0.0f;

    this->EnVec.s.X     =0.0f;
    this->EnVec.s.Y     = 0.0f;
    this->EnVec.s.Z     = 0.0f;


    Matrix4fSetIdentity(&Transform);
    Matrix3fSetIdentity(&LastRot);
    Matrix3fSetIdentity(&ThisRot);

    this->isDragging=false;
    this->isClicked= false;
    this->isRClicked = false;
    this->isZooming = false;
    this->zoomRate = 1;
    this->setBounds(NewWidth NewHeight);
}

void ArcBall_t::upstate()
{
    if(!this->isZooming && this->isRClicked){ // 开始拖动
        this->isZooming = true; // 设置拖动为变量为true
        this->LastPt = this->MousePt;
        this->lastZoomRate = this->zoomRate;
    }
    else if(this->isZooming){//正在拖动
        if(this->isRClicked){                //拖动
            Point2fSub(&this->MousePt &this->LastPt);
            this->zoomRate = this->lastZoomRate + this->MousePt.s.X * this->AdjustWidth * 2;
        }
        else{//停止拖动
            this->isZooming = false;
        }
    }
    else if (!this->isDragging && this->isClicked){                     // 如果没有拖动
        this->isDragging = true;                                        // 设置拖动为变量为true
        this->LastRot = this->ThisRot;
        this->click(&this->MousePt);
    }
    else if(this->isDragging){
        if (this->isClicked){                                            //如果按住拖动
            Quat4fT     ThisQuat;

            this->drag(&this->MousePt &ThisQuat);                        // 更新轨迹球的变量
            Matrix3fSetRotationFromQuat4f(&this->ThisRot &ThisQuat);        // 计算旋转量
            Matrix3fMulMatrix3f(&this->ThisRot &this->LastRot);
            Matrix4fSetRotationFromMatrix3f(&this->Transform &this->ThisRot);
        }
        else  // 如果放开鼠标,设置拖动为false
            this->isDragging = false;
    }
}

//按下鼠标记录当前对应的轨迹球的位置
void    ArcBall_t::click(co

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       4299  2014-03-13 11:14  guijiqiu\ArcBall.cpp

     文件      12735  2014-03-13 11:08  guijiqiu\ArcBall.h

     文件        387  2014-03-12 22:24  guijiqiu\guijiqiu.pro

     文件      17903  2014-03-14 10:46  guijiqiu\guijiqiu.pro.user

     文件        175  2014-03-12 22:22  guijiqiu\main.cpp

     文件       6100  2014-03-14 10:46  guijiqiu\widget.cpp

     文件       6062  2014-03-14 15:05  guijiqiu\widget.cpp.autosave

     文件        546  2014-03-13 09:49  guijiqiu\widget.h

     目录          0  2014-03-14 15:05  guijiqiu

----------- ---------  ---------- -----  ----

                48207                    9


评论

共有 条评论