zoukankan      html  css  js  c++  java
  • openGL漫游功能简单实现

          最近弄openGL漫游功能的时候,在网上找了好多源码都没有达到预期效果,然后就自己写了一个算法分享一下。

      上下键实现位移,左右键实现转动。

      算法思想:由于改变观察点函数原型为:

      void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble   centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);

      该函数定义一个视图矩阵,并与当前矩阵相乘。
      第一组eyex, eyey,eyez 相机在世界坐标的位置
      第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置
      第三组upx,upy,upz 相机向上的方向在世界坐标中的方向
      你把相机想象成为你自己的脑袋:
      第一组数据就是脑袋的位置
      第二组数据就是眼睛看的物体的位置
      第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)

     所以R的作用就是和角度s_angle算出转动之后眼睛应该看向的位置。

     

    #define PI 3.141592653
    #define R 100

    static GLfloat s_eye[] = { 0, 0.0, 1 };        // 观察点的位置
    static GLfloat s_at[] = { 0.0, 0.0, 0.0 };     //观察点的观察方向
    static GLfloat s_angle = 0.0;        //转动角度

    tatic float rad = 0;     //根据转动的角度算出弧值
    float speed = 0.1;     //移动的速度

    .........

    s_at[0] = float(s_eye[0] + R * sin(rad));     // 根据转动角度算出眼睛看的物体的位置的x坐标    
    s_at[2] = float(s_eye[2] - 100 * cos(rad));  //根据转动角度算出眼睛看的物体的位置的y坐标
    s_at[1] = s_eye[1];              //z坐标不变
    gluLookAt(s_eye[0], s_eye[1], s_eye[2], s_at[0], s_at[1], s_at[2], 0.0, 1.0, 0.0);

    ..............

    if (g_keys->keyDown[VK_UP])
    {
    rad = float(PI*s_angle / 180.0f);
    s_eye[2] -= (float)cos(rad) * speed;
    s_eye[0] += (float)sin(rad) * speed;
    //如果按上方向键,沿着转换角度后的方向前进,speed为每次前进的步长,通过sin和cos函数实现沿着现
    //有角度方向前进。
    }
    if (g_keys->keyDown[VK_DOWN])
    {
    rad = float(PI*s_angle / 180.0f);
    s_eye[2] += (float)cos(rad) * speed;
    s_eye[0] -= (float)sin(rad) * speed;
    //如果按下方向键,沿着转换角度后的方向后退,speed为每次前进的步长,通过sin和cos函数实现沿着现
    //有角度方向前进。
    }
    if (g_keys->keyDown[VK_LEFT])
    {
    s_angle -= 0.1;
    rad = float(PI*s_angle / 180.0f);    //每次转动0.1度并算出相应的弧度制
    }
    if (g_keys->keyDown[VK_RIGHT])
    {
    s_angle += 0.1;
    rad = float(PI*s_angle / 180.0f);
    }

                                                                                     

  • 相关阅读:
    什么是结构化数据?什么是半结构化数据?
    安卓图表引擎AChartEngine(一)
    Android中通过pid获取app包名
    Android USER 版本与ENG 版本的差异--MTK官方解释
    Android 各层中日志打印功能的应用
    Android音频系统之AudioFlinger(二)
    Android音频系统之AudioFlinger(一)
    Android音频系统之音频框架
    第1章 音频系统
    Android音频系统之AudioPolicyService
  • 原文地址:https://www.cnblogs.com/wenguang1996/p/4989357.html
Copyright © 2011-2022 走看看