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 对象绕任意轴旋转--模拟门转动
说了几篇的数学方法,这篇放松一下,郭先生说说绕任意轴转动.说一说其中一种方法,也是比较容易理解的一种,它的原理就是将子对象放到一个盒子中,然后改变子对象相对于父对象的位置(因为子对象的原点默认还是在盒 ...
随机推荐
- 关于智能指针auto_ptr
智能指针auto_ptr和shared_ptr也是面试中经常被问到的一个 感觉看auto_ptr的源码反而更加容易理解一些,因为源码的代码量并不大,而且比较容易理解. 本篇主要介绍auto_ptr 其 ...
- 【转载】VS2010+VMWare8+VisualDDK1.5.6 创建并调试驱动程序 - 完全教程
原帖:http://techird.blog.163.com/blog/static/1215640362011112385241568/ 本文描述了如何使用Visual Studio+VMMare+ ...
- 《C++ Primer Plus 6th》读书笔记 - 第8章 函数探幽
1. 摘录 默认参数指的是当函数调用中省略了实参时自动使用的一个值. 默认参数并非编程方面的重大突破,而只是提供了一种便捷的方式.使用默认参数,可以减少要定义的析构函数.方法以及方法重载的数量. 试图 ...
- iOS定位与地图
定位: 手机上定位的实现主要有三种方式:基站(附近基站的位置),wifi(所连接路由器的位置),卫星(最准确,也最耗能). iOS的定位功能主要是由CLLocationManager类来完成的.这个类 ...
- ecshop开发日志之支付插件开发
ecshop开发一个支付插件的方法(例如要新建一个为paytest-----支付测试)1.languages/zh_cn/payment/目录下新建一个paytest.php文件 内容如下: < ...
- Atom power-mode
最近看到很多大牛都在用这个酷炫狂拽掉渣天的插件,于是就默默地git了一波.实际结果就是机械键盘加上砰砰砰砰,根本停不下来有没有. 建议(ˉ(∞)ˉ) :视力2.0的同学不建议使用,眼瞎的同学用就用吧, ...
- css负边距自适应布局
单列定宽单列自适应布局: <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> ...
- EcShop后台添加菜单[步骤]
1. 添加菜单的链接地址:打开文件[/后台目录/includes/inc_menu.php],在结尾加入例如:$modules['dashi']['dashi_list'] = 'join_dashi ...
- CSS自学笔记(5):CSS的样式
CSS中拥有各种各样的样式表,而基本的样式有背景,文本,字体,链接,列表,表格,轮廓. 一.CSS-背景 CSS中允许用纯色背景,也允许用图片来创建复杂的个性背景. p {background-col ...
- Python Tensorflow下的Word2Vec代码解释
前言: 作为一个深度学习的重度狂热者,在学习了各项理论后一直想通过项目练手来学习深度学习的框架以及结构用在实战中的知识.心愿是好的,但机会却不好找.最近刚好有个项目,借此机会练手的过程中,我发现其实各 ...