一個計算glRotato後的座標的示例代碼

使用OpenGL顯示簡單的視頻,對於一些紋理需要旋轉並水平翻轉,找到一個示例代碼,做少量修改

// RotateByVector.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"

#include <iostream>
#include <math.h>

using namespace std;
#define CV_PI 3.1415926

//定義返回結構體
struct Point3f
{
    Point3f()
    {
        x = 0.0f;
        y = 0.0f;
        z = 0.0f;
    }

    Point3f(double _x, double _y, double _z)
    {
        x = _x;
        y = _y;
        z = _z;
    }
    double x;
    double y;
    double z;
};

//點繞任意向量旋轉,右手系
//輸入參數old_x,old_y,old_z爲旋轉前空間點的座標
//vx,vy,vz爲旋轉軸向量
//theta爲旋轉角度角度制,範圍在-180到180
//返回值爲旋轉後坐標點
Point3f RotateByVector(double old_x, double old_y, double old_z, double vx, double vy, double vz, double theta)
{
    double r = theta * CV_PI / 180;
    double c = cos(r);
    double s = sin(r);
    double new_x = (vx*vx*(1 - c) + c) * old_x + (vx*vy*(1 - c) - vz * s) * old_y + (vx*vz*(1 - c) + vy * s) * old_z;
    double new_y = (vy*vx*(1 - c) + vz * s) * old_x + (vy*vy*(1 - c) + c) * old_y + (vy*vz*(1 - c) - vx * s) * old_z;
    double new_z = (vx*vz*(1 - c) - vy * s) * old_x + (vy*vz*(1 - c) + vx * s) * old_y + (vz*vz*(1 - c) + c) * old_z;
    return Point3f(new_x, new_y, new_z);
}

// 可類比glRotate
Point3f RotateByVector(Point3f in_, double vx, double vy, double vz, double theta)
{
    double r = theta * CV_PI / 180;
    double c = cos(r);
    double s = sin(r);
    double new_x = (vx*vx*(1 - c) + c) * in_.x + (vx*vy*(1 - c) - vz * s) * in_.y + (vx*vz*(1 - c) + vy * s) * in_.z;
    double new_y = (vy*vx*(1 - c) + vz * s) * in_.x + (vy*vy*(1 - c) + c) * in_.y + (vy*vz*(1 - c) - vx * s) * in_.z;
    double new_z = (vx*vz*(1 - c) - vy * s) * in_.x + (vy*vz*(1 - c) + vx * s) * in_.y + (vz*vz*(1 - c) + c) * in_.z;
    return Point3f(new_x, new_y, new_z);
}

int main()
{
    // 原始
    Point3f A[] = {
        Point3f(1.0f,  1.0f, 0.0f),
        Point3f(1.0f,  -1.0f, 0.0f),
        Point3f(-1.0f, -1.0f, 0.0f),
        Point3f(-1.0f,  1.0f, 0.0f)
    };
    Point3f B[sizeof(A)/sizeof(Point3f)];
    Point3f C[sizeof(A)/sizeof(Point3f)];

    memset(&B, 0, sizeof(B));
    memset(&C, 0, sizeof(B));

    for(unsigned int idx = 0; idx < sizeof(A)/sizeof(Point3f); idx ++){
        // 圍繞Z軸,旋轉90度
        B[idx] = RotateByVector(A[idx], 0, 0, -1, 90);
        printf("idx: %d, x: %.05f, y: %.05f, z: %.05f\n", idx, B[idx].x, B[idx].y, B[idx].z);
    }
    printf("\n\n");
    for(unsigned int idx = 0; idx < sizeof(A)/sizeof(Point3f); idx ++){
        // 再水平翻轉
        C[idx] = RotateByVector(B[idx], 0, 1, 0, 180);
        printf("idx: %d, x: %.05f, y: %.05f, z: %.05f\n", idx, C[idx].x, C[idx].y, C[idx].z);
    }

    system("pause");
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章