opengl 正方体+模拟视角旋转
// first_3D.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <GL/glut.h>
#include <math.h> // 将立方体的八个顶点保存到一个数组里面
static const GLfloat vertex_list[][] = {
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
};
//变换后数组
GLfloat vertex_list_new[][] = {
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
}; void work(float T[][])
{
GLfloat list_temp[][];
for(int i=;i<;i++)
for(int j=;j<;j++)
list_temp[i][j] = vertex_list_new[i][j];
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
float sum = ;
for(int k=;k<;k++)
{
sum+=list_temp[i][k]*T[k][j];
}
vertex_list_new[i][j] = sum;
}
}
return;
}
// 将要使用的顶点的序号保存到一个数组里面
static const GLint index_list[][] = {
, , , ,
, , , ,
, , , ,
, , , ,
, , , ,
, , , ,
}; void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//gluLookAt(1.5,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0);//视点 /* /坐标轴
glLineWidth(1);
glColor3f( 0.0, 0.0, 0.0); // 黑色
glBegin(GL_LINES);
glVertex3f(-0xFFFFFFF,0,0);
glVertex3f(0xFFFFFFF,0,0);
glVertex3f(0,-0xFFFFFFF,0);
glVertex3f(0,0xFFFFFFF,0);
glVertex3f(0,0,-0xFFFFFFF);
glVertex3f(0,0,0xFFFFFFF);
glEnd();
//坐标轴绘制结束*/ /* /绘制原立方体
glColor3f( 1.0, 1.0, 0.0);
//glBegin(GL_QUADS);
for(int i=0; i<6; ++i) // 有六个面,循环六次
{
glBegin( GL_LINE_LOOP);
for(int j=0; j<4; ++j) // 每个面有四个顶点,循环四次
{
glVertex3fv(vertex_list[index_list[i][j]]);
}
glEnd();
}
//立方体绘制结束*/ //绘制新立方体
glColor3f( 1.0, 0.0, 0.0);
//glBegin(GL_QUADS);
for(int i=; i<; ++i) // 有六个面,循环六次
{
glBegin( GL_LINE_LOOP);
for(int j=; j<; ++j) // 每个面有四个顶点,循环四次
{
glVertex3fv(vertex_list_new[index_list[i][j]]);
}
glEnd();
}
//立方体绘制结束
glFlush();
glutSwapBuffers();
} void reshape(int w,int h)
{
glViewport(,,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);
} void init()
{
glClearColor( , , , 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//glOrtho(-4.0,4.0,-4.0,4.0,-4.0,4.0);
glMatrixMode(GL_MODELVIEW);
} int main(int argc,char** argv)
{
//计算部分
float a,b,c;//Ov
a = ;
b = ;
c = ;
float R = sqrt(a*a+b*b+c*c);
float d = 1.0;
float costh = c/sqrt(a*a+c*c);
float sinth = a/sqrt(a*a+c*c);
float cosfy = b/R;
float sinfy = sqrt(a*a+c*c)/R; float T1[][] = {{,,,},{,,,},{,,,},{-a,-b,-c,}}; //原点到视点平移变换矩阵
float T2[][] = {{-costh,,-sinth,},{,,,},{sinth,,-costh,},{,,,}}; //绕y1轴旋转变换
float T3[][] = {{,,,},{,sinfy,-cosfy,},{,cosfy,sinfy,},{,,,}}; //绕x2轴旋转变换
float T4[][] = {{-,,,},{,,,},{,,,},{,,,}}; //关于y3Ovz3面的反射变换
//work(T1);work(T2);work(T3);work(T4); //世界--观察坐标系 合成矩阵
float Tv[][] = {{cosfy,-cosfy*sinth,-sinfy*sinth,},{,sinfy,-cosfy,},{-sinth,-cosfy*costh,-sinfy*costh,},{,,R,}};
//work(Tv); float Tpersp[][] = {{,,,},{,,,},{,,,/d},{,,,}}; //透视矩阵
float Tproj[][] = {{-,,,},{,,,},{,,,},{,,,}}; //投影矩阵
//work(Tpersp);work(Tproj);
float Ts[][] = {{,,,},{,,,},{,,,/d},{,,,}}; //合成
//work(Ts); //总合成
float T[][] = {{costh,-costh*sinth,,-sinfy*sinth/d},{,sinfy,,-cosfy/d},{-sinth,-cosfy*costh,,-sinfy*costh/d},{,,,R/d}};
work(T); float T_1[][] = {{,,,},{,,,},{,,,-/d},{,,,R/d}};
//work(T_1); glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(,);
glutInitWindowPosition(,);
glutCreateWindow("立方体");
glutReshapeFunc(reshape);
glutDisplayFunc(display);
init();
glutMainLoop();
return ;
}
opengl 正方体+模拟视角旋转的更多相关文章
- Matlab之视角旋转函数[转]
Matlab中有两个视角旋转函数:view和rotate,下面详细介绍: view: 一: view(az,el):az是方位角,el是仰角,单位均是度.具体: 以x轴从左到右(即从小到大)平行放置在 ...
- OpenGL中平移、旋转、缩放矩阵堆栈操作
在OpenGL中,图元的几何变换均为线性变换,通过矩阵变换实现.OpenGL中的坐标用齐次坐标表示,即(x,y,z)表示成(x',y',z',h),其中x=x'/h; y=y'/h; z=z'/h. ...
- OpenGL ES 响应屏幕旋转 iOS
iOS下使用OpenGL 如果使用GLKit View 那么不用担心屏幕旋转的问题,说明如下: If you change the size, scale factor, or drawable pr ...
- 让camera实现类似cs第一人称视角旋转和位移
直接把这个脚本挂在摄像机上就可: using System.Collections; using System.Collections.Generic; using UnityEngine; /* * ...
- OPENGL 显示BMP图片+旋转
VS2010/Windows 7/ 1. 需包含头文件 stdio.h, glaux.h, glut.h.需要对应的lib,并添加包含路径 2. 窗口显示用glut库的函数 3. bmp图片从本地读取 ...
- [CSP-S模拟测试]:旋转子段(数学)
题目描述 $ZYL$有$N$张牌编号分别为$1,2,...,N$.他把这$N$张牌打乱排成一排,然后他要做一次旋转使得旋转后固定点尽可能多.如果第$i$个位置的牌的编号为$i$,我们就称之为固定点.旋 ...
- OpenGL的glRotatef旋转变换函数详解
OpenGL的glRotatef旋转变换函数详解 先看一下函数定义:void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLflo ...
- WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体
原文:WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体 运行结果: 事实上很简单,定义好一个正方体,处理好纹理.关于MeshGeometry3D的正确定义和纹理这里就不多讲 ...
- three.js 对象绕任意轴旋转--模拟门转动
说了几篇的数学方法,这篇放松一下,郭先生说说绕任意轴转动.说一说其中一种方法,也是比较容易理解的一种,它的原理就是将子对象放到一个盒子中,然后改变子对象相对于父对象的位置(因为子对象的原点默认还是在盒 ...
随机推荐
- ES6笔记③
1.查找关键字 includes(); 返回布尔值 //①:includes -->代替-->indexof-->返回布尔值 var str = "769909303&q ...
- js对表单设置了readonly和disabled后的区别
Readonly和Disabled是用在表单中的两个属性,它们都能够做到使用户不能够更改表单域中的内容.但是它们之间有着微小的差别,总结如下: 1)Readonly只针对input(text / pa ...
- EC读书笔记系列之7:条款12 复制对象时勿忘其每一个成分
记住: ★copying函数应确保复制“对象内的所有成员变量”及“所有base class成分” ★不要尝试以某个copying函数实现另一个copying函数.应该将共同机能放进第三个函数中,并由两 ...
- C++ 虚函数机制学习
致谢 本文是基于对<Inside the c++ object model>的阅读和gdb的使用而完成的.在此感谢Lippman对cfront中对象模型的解析,这些解析帮助读者拨开迷雾.此 ...
- BZOJ 3875: [Ahoi2014]骑士游戏
d[i]表示消灭i所需的最小体力值, d[i] = min(S[i], K[i]+Σd[x]), Σd[x]表示普通攻击而产生的其他怪兽. 因为不是DAG, 所以用个队列类似SPFA来更新答案. -- ...
- Git 系列(一):什么是 Git
欢迎阅读本系列关于如何使用 Git 版本控制系统的教程!通过本文的介绍,你将会了解到 Git 的用途及谁该使用 Git. 如果你刚步入开源的世界,你很有可能会遇到一些在 Git 上托管代码或者发布使用 ...
- shell命令实战详解
1.解析路径获取文件名和目录名. 获取文件名 #awk解法:用“/”做分隔符,然后打印出最后的那一部分. resFile=`echo /tmp/csdn/zhengyi/test/adb.l ...
- libcurl编译
下载: git://github.com/bagder/curl.git openssl: openssl编译 for linux or mingw:./buildconf./configure ...
- rsyslog 定义模板
rsyslog默认会将特殊字符(\t)转换成#009 由全局配置$EscapeControlCharactersOnReceive 决定,如果自己需要根据\t处理输出时,需将该选项改为 off. $E ...
- VPN的分类方式
VPN的分类方式 VPN的分类方式比较混乱.不同的生产厂家在销售它们的VPN产品时使用了不同的分类方式,它们主要是产品的角度来划分的.不同的ISP在开展VPN业务时也推出了不同的分类方式,他们主 ...