如何实现通过鼠标的点击进行正交投影和透视投影间的切换

weixin_41288181 2018-10-15 12:12:19
我想实现通过鼠标或者键盘进行正交和透视投影的切换,我的reshape函数如下:
其中正交的和透视的都写出来了,但是不知道如何通过鼠标来切换

void Reshape(int w1, int h1) {

WinWidth = w1;
WinHeight = h1;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glViewport(0, 0, w1, h1);
gluPerspective(70, 1.0*w1 / h1, 1, 1000);//透视
glOrtho(-30.0f, 30.0f, -30.0f, 30.0f, -60.0f, 60.0f);//正交
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

下面是源码,在mymouse那个函数里不知道怎么写。。。

#include "stdafx.h"
#include <GL/glut.h>
#include <math.h>
#include <time.h>
#include <stdio.h>

int WinWidth, WinHeight;
double posX, posY, posZ, viewX, viewY, viewZ, upX, upY, upZ;
const GLfloat PI = 3.141515926;

void setAll(double px, double py, double pz,
double vx, double vy, double vz,
double ux, double uy, double uz)
{
posX = px;
posY = py;
posZ = pz;
viewX = vx;
viewY = vy;
viewZ = vz;
upX = ux;
upY = uy;
upZ = uz;
}

void setLookAt() {
gluLookAt(posX, posY, posZ,
viewX, viewY, viewZ,
upX, upY, upZ);
}

void setPos(double x, double y, double z) {
posX = x;
posY = y;
posZ = z;
}

void DisplayBox() {

GLfloat x, y, angle;
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.0f, 7.5f, 0.0f);

int ipvot = 0;
for (angle = 0.0f; angle <= (4.0f*PI); angle += (PI / 8.0f)) {
x = 5.0f*sin(angle);
y = 5.0f*cos(angle);

if (ipvot % 2 == 0) glColor3f(1.0f, 1.0f, 0.0f);
else glColor3f(0.0f, 1.0f, 1.0f);

ipvot++;
glVertex3f(x, 0.0f, y);
}
glEnd();

glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.0f, 0.0f, 0.0f);

for (angle = 0.0f; angle <= (4.0f*PI); angle += (PI / 8.0f)) {
x = 5.0f*sin(angle);
y = 5.0f*cos(angle);

if (ipvot % 2 == 0) glColor3f(0.5f, 0.0f, 0.5f);
else glColor3f(1.0f, 0.0f, 1.0f);

ipvot++;
glVertex3f(x, 0.0f, y);
}
glEnd();

glBegin(GL_TRIANGLE_FAN);
glVertex3f(10.0f, 7.5f, 0.0f);

int ipvot1 = 0;
for (angle = 0.0f; angle <= (4.0f*PI); angle += (PI / 8.0f)) {
x = 5.0f*sin(angle);
y = 5.0f*cos(angle);

if (ipvot1 % 2 == 0) glColor3f(1.0f, 1.0f, 0.0f);
else glColor3f(0.0f, 1.0f, 1.0f);

ipvot1++;
glVertex3f(10.0f+x, 0.0f, y);
}
glEnd();

glBegin(GL_TRIANGLE_FAN);
glVertex3f(10.0f, 0.0f, 0.0f);

for (angle = 0.0f; angle <= (4.0f*PI); angle += (PI / 8.0f)) {
x = 5.0f*sin(angle);
y = 5.0f*cos(angle);

if (ipvot % 2 == 0) glColor3f(0.5f, 0.0f, 0.5f);
else glColor3f(1.0f, 0.0f, 1.0f);

ipvot++;
glVertex3f(10.0f+x, 0.0f, y);
}
glEnd();

glBegin(GL_TRIANGLE_FAN);
glVertex3f(-10.0f, 7.5f, 0.0f);


for (angle = 0.0f; angle <= (4.0f*PI); angle += (PI / 8.0f)) {
x = 5.0f*sin(angle);
y = 5.0f*cos(angle);

if (ipvot1 % 2 == 0) glColor3f(1.0f, 1.0f, 0.0f);
else glColor3f(0.0f, 1.0f, 1.0f);

ipvot1++;
glVertex3f(-10.0f + x, 0.0f, y);
}
glEnd();

glBegin(GL_TRIANGLE_FAN);
glVertex3f(-10.0f, 0.0f, 0.0f);

for (angle = 0.0f; angle <= (4.0f*PI); angle += (PI / 8.0f)) {
x = 5.0f*sin(angle);
y = 5.0f*cos(angle);

if (ipvot % 2 == 0) glColor3f(0.5f, 0.0f, 0.5f);
else glColor3f(1.0f, 0.0f, 1.0f);

ipvot++;
glVertex3f(-10.0f + x, 0.0f, y);
}
glEnd();




}

void DrawGrid() {
glLineWidth(2);
glColor3f(0.0, 0.0, 1.0);
for (int i = -100; i <= 100; i += 10) {
glBegin(GL_LINES);
glVertex3f(i, 0.0f, -100.0f);
glVertex3f(i, 0.0f, 100.f);
glEnd();

glBegin(GL_LINES);
glVertex3f(-100.0f, 0.0f, i);
glVertex3f(100.0f, 0.0f, i);
glEnd();
}
}

void Display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
DrawGrid();
DisplayBox();
glutSwapBuffers();
}

void update() {
glLoadIdentity();
setLookAt();
glutPostRedisplay();
}

void Reshape(int w1, int h1) {

WinWidth = w1;
WinHeight = h1;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glViewport(0, 0, w1, h1);
gluPerspective(70, 1.0*w1 / h1, 1, 1000);
//glOrtho(-30.0f, 30.0f, -30.0f, 30.0f, -60.0f, 60.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void init() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST);
setAll(20, 1.75, 0, 0, 1.75, 0, 0, 1, 0);

}

void ProcessKeyBoard(int key, int x, int y) {
static double delta;
if (key == GLUT_KEY_LEFT) {
delta += 0.03;
setPos(20 * cos(delta), posY, 20 * sin(delta));
}
else if (key == GLUT_KEY_RIGHT) {
delta -= 0.03;
setPos(20 * cos(delta), posY, 20 * sin(delta));
}
else if (key == GLUT_KEY_UP) {
delta += 0.03;
setPos(20 * cos(delta), 40 * sin(delta), posZ);
}
else if (key == GLUT_KEY_DOWN) {
delta -= 0.03;
setPos(20 * cos(delta), 40 * sin(delta), posZ);
}
//setPos(20 * cos(delta), posY, 20 * sin(delta));
}

void myMouse(int button, int state, int x, int y) {
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {



}
if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
{
glOrtho(-30.0f, 30.0f, -30.0f, 30.0f, -60.0f, 60.0f);

}

glutPostRedisplay();
}

int main(int argc, char *argv[]) {
WinWidth = 400;
WinHeight = 400;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(WinWidth, WinHeight);
glutCreateWindow("Rita's OpenGL");

glutReshapeFunc(&Reshape);
//glutMouseFunc(&myMouse);
glutIdleFunc(&update);
glutDisplayFunc(&Display);
glutSpecialFunc(ProcessKeyBoard);//写 char key和int key 的区别 glutKeyboardFunc &
init();
glutMainLoop();
return 0;
}

opengl新手,求各位爸爸们指点指点
...全文
213 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_41288181 2018-10-15
  • 打赏
  • 举报
回复
啊啊啊传上去的为什么有什么<br data-filtered="filtered">,下面是没有的!!!

#include "stdafx.h"
#include <GL/glut.h>
#include <math.h>
#include <time.h>
#include <stdio.h>

int WinWidth, WinHeight;
double posX, posY, posZ, viewX, viewY, viewZ, upX, upY, upZ;
const GLfloat PI = 3.141515926;

void setAll(double px, double py, double pz,
double vx, double vy, double vz,
double ux, double uy, double uz)
{
posX = px;
posY = py;
posZ = pz;
viewX = vx;
viewY = vy;
viewZ = vz;
upX = ux;
upY = uy;
upZ = uz;
}

void setLookAt() {
gluLookAt(posX, posY, posZ,
viewX, viewY, viewZ,
upX, upY, upZ);
}

void setPos(double x, double y, double z) {
posX = x;
posY = y;
posZ = z;
}

void DisplayBox() {

GLfloat x, y, angle;
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.0f, 7.5f, 0.0f);

int ipvot = 0;
for (angle = 0.0f; angle <= (4.0f*PI); angle += (PI / 8.0f)) {
x = 5.0f*sin(angle);
y = 5.0f*cos(angle);

if (ipvot % 2 == 0) glColor3f(1.0f, 1.0f, 0.0f);
else glColor3f(0.0f, 1.0f, 1.0f);

ipvot++;
glVertex3f(x, 0.0f, y);
}
glEnd();

glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.0f, 0.0f, 0.0f);

for (angle = 0.0f; angle <= (4.0f*PI); angle += (PI / 8.0f)) {
x = 5.0f*sin(angle);
y = 5.0f*cos(angle);

if (ipvot % 2 == 0) glColor3f(0.5f, 0.0f, 0.5f);
else glColor3f(1.0f, 0.0f, 1.0f);

ipvot++;
glVertex3f(x, 0.0f, y);
}
glEnd();

glBegin(GL_TRIANGLE_FAN);
glVertex3f(10.0f, 7.5f, 0.0f);

int ipvot1 = 0;
for (angle = 0.0f; angle <= (4.0f*PI); angle += (PI / 8.0f)) {
x = 5.0f*sin(angle);
y = 5.0f*cos(angle);

if (ipvot1 % 2 == 0) glColor3f(1.0f, 1.0f, 0.0f);
else glColor3f(0.0f, 1.0f, 1.0f);

ipvot1++;
glVertex3f(10.0f+x, 0.0f, y);
}
glEnd();

glBegin(GL_TRIANGLE_FAN);
glVertex3f(10.0f, 0.0f, 0.0f);

for (angle = 0.0f; angle <= (4.0f*PI); angle += (PI / 8.0f)) {
x = 5.0f*sin(angle);
y = 5.0f*cos(angle);

if (ipvot % 2 == 0) glColor3f(0.5f, 0.0f, 0.5f);
else glColor3f(1.0f, 0.0f, 1.0f);

ipvot++;
glVertex3f(10.0f+x, 0.0f, y);
}
glEnd();

glBegin(GL_TRIANGLE_FAN);
glVertex3f(-10.0f, 7.5f, 0.0f);


for (angle = 0.0f; angle <= (4.0f*PI); angle += (PI / 8.0f)) {
x = 5.0f*sin(angle);
y = 5.0f*cos(angle);

if (ipvot1 % 2 == 0) glColor3f(1.0f, 1.0f, 0.0f);
else glColor3f(0.0f, 1.0f, 1.0f);

ipvot1++;
glVertex3f(-10.0f + x, 0.0f, y);
}
glEnd();

glBegin(GL_TRIANGLE_FAN);
glVertex3f(-10.0f, 0.0f, 0.0f);

for (angle = 0.0f; angle <= (4.0f*PI); angle += (PI / 8.0f)) {
x = 5.0f*sin(angle);
y = 5.0f*cos(angle);

if (ipvot % 2 == 0) glColor3f(0.5f, 0.0f, 0.5f);
else glColor3f(1.0f, 0.0f, 1.0f);

ipvot++;
glVertex3f(-10.0f + x, 0.0f, y);
}
glEnd();




}

void DrawGrid() {
glLineWidth(2);
glColor3f(0.0, 0.0, 1.0);
for (int i = -100; i <= 100; i += 10) {
glBegin(GL_LINES);
glVertex3f(i, 0.0f, -100.0f);
glVertex3f(i, 0.0f, 100.f);
glEnd();

glBegin(GL_LINES);
glVertex3f(-100.0f, 0.0f, i);
glVertex3f(100.0f, 0.0f, i);
glEnd();
}
}

void Display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
DrawGrid();
DisplayBox();
glutSwapBuffers();
}

void update() {
glLoadIdentity();
setLookAt();
glutPostRedisplay();
}

void Reshape(int w1, int h1) {

WinWidth = w1;
WinHeight = h1;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glViewport(0, 0, w1, h1);
gluPerspective(70, 1.0*w1 / h1, 1, 1000);
//glOrtho(-30.0f, 30.0f, -30.0f, 30.0f, -60.0f, 60.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void init() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST);
setAll(20, 1.75, 0, 0, 1.75, 0, 0, 1, 0);

}

void ProcessKeyBoard(int key, int x, int y) {
static double delta;
if (key == GLUT_KEY_LEFT) {
delta += 0.03;
setPos(20 * cos(delta), posY, 20 * sin(delta));
}
else if (key == GLUT_KEY_RIGHT) {
delta -= 0.03;
setPos(20 * cos(delta), posY, 20 * sin(delta));
}
else if (key == GLUT_KEY_UP) {
delta += 0.03;
setPos(20 * cos(delta), 40 * sin(delta), posZ);
}
else if (key == GLUT_KEY_DOWN) {
delta -= 0.03;
setPos(20 * cos(delta), 40 * sin(delta), posZ);
}
//setPos(20 * cos(delta), posY, 20 * sin(delta));
}

void myMouse(int button, int state, int x, int y) {
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {



}
if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
{
glOrtho(-30.0f, 30.0f, -30.0f, 30.0f, -60.0f, 60.0f);

}

glutPostRedisplay();
}

int main(int argc, char *argv[]) {
WinWidth = 400;
WinHeight = 400;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(WinWidth, WinHeight);
glutCreateWindow("Rita's OpenGL");

glutReshapeFunc(&Reshape);
//glutMouseFunc(&myMouse);
glutIdleFunc(&update);
glutDisplayFunc(&Display);
glutSpecialFunc(ProcessKeyBoard);//写 char key和int key 的区别 glutKeyboardFunc &
init();
glutMainLoop();
return 0;
}
weixin_41288181 2018-10-15
  • 打赏
  • 举报
回复
代码能写的具体点嘛,就是加在哪里的那种,我实在想不出来啊啊啊
jiht594 2018-10-15
  • 打赏
  • 举报
回复
mouse函数里设置bool变量,reshape里面通过变量来决定是哪个投影
赵4老师 2018-10-15
  • 打赏
  • 举报
回复
int useP=0;//设置一个全局变量
useP=1-useP;//切换投影方式
if (useP) {//使用透视投影
//...
} else {//使用正交投影
//...
}
基于OpenGL的正交投影透视投影的C++实现源码(含使用说明+exe可执行文件).zip基于OpenGL的正交投影透视投影的C++实现源码(含使用说明+exe可执行文件).zip基于OpenGL的正交投影透视投影的C++实现源码(含使用说明+exe可执行文件).zip基于OpenGL的正交投影透视投影的C++实现源码(含使用说明+exe可执行文件).zip基于OpenGL的正交投影透视投影的C++实现源码(含使用说明+exe可执行文件).zip基于OpenGL的正交投影透视投影的C++实现源码(含使用说明+exe可执行文件).zip基于OpenGL的正交投影透视投影的C++实现源码(含使用说明+exe可执行文件).zip基于OpenGL的正交投影透视投影的C++实现源码(含使用说明+exe可执行文件).zip基于OpenGL的正交投影透视投影的C++实现源码(含使用说明+exe可执行文件).zip基于OpenGL的正交投影透视投影的C++实现源码(含使用说明+exe可执行文件).zip基于OpenGL的正交投影透视投影的C++实现源码(含使用说明+exe可执行文件).zip 基于OpenGL的正交投影透视投影的C++实现源码(含使用说明+exe可执行文件).zip 基于OpenGL的正交投影透视投影的C++实现源码(含使用说明+exe可执行文件).zip 【备注】 1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载使用体验! 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈!

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧