opengl如何用键盘实现放大缩小平移的问题

在程序中如何用QW实现X轴旋转,AS轴实现Y轴旋转,ZX实现Z轴旋转,OP实现平移,上下箭头分别实现放大和缩小,求一般代码... 在程序中如何用QW实现X轴旋转,AS轴实现Y轴旋转,ZX实现Z轴旋转,OP实现平移,上下箭头分别实现放大和缩小,求一般代码 展开
 我来答
孤城太守
2013-11-29 · TA获得超过216个赞
知道小有建树答主
回答量:177
采纳率:66%
帮助的人:61万
展开全部
// 工具界面View.cpp : C工具界面View 类的实现
//

#include "stdafx.h"
// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
// ATL 项目中进行定义,并允许与该项目共享文档代码。
#ifndef SHARED_HANDLERS
#include "工具界面.h"
#endif

#include "工具界面Doc.h"
#include "工具界面View.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// C工具界面View

IMPLEMENT_DYNCREATE(C工具界面View, CView)

BEGIN_MESSAGE_MAP(C工具界面View, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_SIZE()
ON_COMMAND(ID_ceshi1, &C工具界面View::OnCeshi1)
ON_COMMAND(ID_ceshi2, &C工具界面View::OnCeshi2)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDOWN()
ON_WM_KEYDOWN()
END_MESSAGE_MAP()

// C工具界面View 构造/析构

C工具界面View::C工具界面View()
{
// TODO: 在此处添加构造代码
m_pDC=new CClientDC(this);
gg=10.0;
jj=1.0;
kk=0.0;

}

C工具界面View::~C工具界面View()
{
}

BOOL C工具界面View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式
cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;

return CView::PreCreateWindow(cs);
}

// C工具界面View 绘制

void C工具界面View::OnDraw(CDC* /*pDC*/)
{
C工具界面Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

// TODO: 在此处为本机数据添加绘制代码
}

// C工具界面View 打印

BOOL C工具界面View::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}

void C工具界面View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加额外的打印前进行的初始化过程
}

void C工具界面View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加打印后进行的清理过程
}

// C工具界面View 诊断

#ifdef _DEBUG
void C工具界面View::AssertValid() const
{
CView::AssertValid();
}

void C工具界面View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}

C工具界面Doc* C工具界面View::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(C工具界面Doc)));
return (C工具界面Doc*)m_pDocument;
}
#endif //_DEBUG

// C工具界面View 消息处理程序

BOOL C工具界面View::SetupPixelFormat(HDC hDC)
{
static PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL|
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
24,
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0, 0, 0
};
int pixelformat;

//选择像素以索引

if((pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0)
{

return FALSE;
}

//设置像素索引

if(SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd) == FALSE)
{

return FALSE;
}

return TRUE;
}

//创建环境RC
BOOL C工具界面View::CreateViewGLContext(HDC hDC)
{
//生成绘制描述表
this->m_hGLContext = ::wglCreateContext(hDC);
if(this->m_hGLContext==NULL)
{
//创建失败
return FALSE;
}
//设置当前绘制描述表
if(::wglMakeCurrent(hDC,this->m_hGLContext)==FALSE)
{
//选为当前RC失败
return FALSE;
}
return TRUE;
}

//gl初始化

BOOL C工具界面View::InitOpengl(CDC *pDC)
{
{
m_pDC=new CClientDC(this);
//设置像素格式
if (SetupPixelFormat(hDC) == FALSE)
return 0;
//创建并设置RC
if (CreateViewGLContext(m_pDC->GetSafeHdc()) == FALSE)
{
return FALSE;
}
return TRUE;
}
}

int C工具界面View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: 在此添加您专用的创建代码
m_pDC=new CClientDC(this);

//使用窗口DC来设置RC

InitOpengl(m_pDC);

return 0;
}

void C工具界面View::OnDestroy()
{
CView::OnDestroy();

// TODO: 在此处添加消息处理程序代码
if(wglGetCurrentContext()!=NULL)
{
wglMakeCurrent(NULL,NULL);
}
if(this->m_hGLContext!=NULL)
{
wglDeleteContext(this->m_hGLContext);
this->m_hGLContext = NULL;
}
if (m_pDC->GetSafeHdc())
{
DeleteObject(m_pDC);
}
}

void C工具界面View::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);

// TODO: 在此处添加消息处理程序代码
GLsizei width, height;
GLdouble aspect;
width = cx;
height = cy;
if (cy==0)
aspect = (GLdouble)width;
else
aspect = (GLdouble)width/(GLdouble)height;

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,aspect,0.0,200.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

}

void C工具界面View::OnCeshi1()
{
// TODO: 在此添加命令处理程序代码
CPaintDC dc(this);
ceshifun1(0.0,0.0,0.0);
}
bool C工具界面View::ceshifun1(float mm=0.0, float nn=0.0,float oo=0.0)
{
glClearColor(1.0f,1.0f,1.0f,0.0f);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(100.0,100.0,100.0,0.0,0.0,0.0,0.0,1.0,0.0);
glTranslatef(mm,nn,oo);

glColor3f(0.0,1.0,0.0);
auxWireTeapot(40.00);

glFlush();
::SwapBuffers(m_pDC->GetSafeHdc()); //交换缓冲区
return TRUE;

}

void C工具界面View::OnCeshi2()
{
// TODO: 在此添加命令处理程序代码
ceshifun2(60.0,0.0,0.0,0.0,1.0,1.0,1.0);
}
bool C工具界面View::ceshifun2(float ss=60.0,float aa=0.0,float bb=0.0,float cc=0.0,float dd=1.0,float ee=1.0,float ff=1.0)
{
glClearColor(1.0f,1.0f,1.0f,0.0f);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(100.0,100.0,100.0,0.0,0.0,0.0,0.0,1.0,0.0);
glRotatef(ss,aa,bb,cc);
glScalef(dd,ee,ff);

glColor3f(0.0,1.0,0.0);
auxWireTeapot(40.00);

glFlush();
::SwapBuffers(m_pDC->GetSafeHdc()); //交换缓冲区

return true;
}

void C工具界面View::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CView::OnPaint()
}

void C工具界面View::OnLButtonDown(UINT nFlags, CPoint point)
{
gg++;
hh=gg/10;

// TODO: 在此添加消息处理程序代码和/或调用默认值
C工具界面View::ceshifun2(60.0,0.0,0.0,0.0,hh,hh,hh);

CView::OnLButtonDown(nFlags, point);
}

void C工具界面View::OnRButtonDown(UINT nFlags, CPoint point)
{
jj++;
ii=10*jj;
// TODO: 在此添加消息处理程序代码和/或调用默认值
C工具界面View::ceshifun2(ii,7.0,7.0,0.0,1.0,1.0,1.0);

CView::OnRButtonDown(nFlags, point);
}

void C工具界面View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
kk++;
ll=10*kk;
switch(nChar)
{
case'w':
case'W':
C工具界面View::ceshifun1(ll,0.0,0.0);
break;
case's':
case'S':
C工具界面View::ceshifun1((-ll),0.0,0.0);
break;
case'a':
case'A':
C工具界面View::ceshifun1(0.0,ll,0.0);
break;
case'd':
case'D':
C工具界面View::ceshifun1(0.0,(-ll),0.0);
break;
}

CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
普洛智应
2013-12-04 · 知道合伙人互联网行家
普洛智应
知道合伙人互联网行家
采纳数:410 获赞数:1585
虚拟现实(VR/AR)以及游戏相关技术,物联网以及传感器技术

向TA提问 私信TA
展开全部
void speckeys( int key, int x, int y )
{
if ( key == GLUT_KEY_LEFT )mm = glm::translate( mm, glm::vec3( -0.1f, 0.0f, 0.0f ) );

else if( key == GLUT_KEY_RIGHT )mm = glm::translate( mm, glm::vec3( 0.1f, 0.0f, 0.0f ) );

else if( key == GLUT_KEY_UP )mm = glm::translate( mm, glm::vec3( 0.0f, 0.0f, -0.1f ) ); 

else if( key == GLUT_KEY_DOWN )mm = glm::translate( mm, glm::vec3( 0.0f, 0.0f, 0.1f ) ); 
glutPostRedisplay();
}


本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
redfloyd
2013-11-30 · TA获得超过437个赞
知道小有建树答主
回答量:353
采纳率:0%
帮助的人:255万
展开全部
楼上的回答真不是一般的详细啊。。。仔细一看对问题没啥帮助啊。。。不过有可以借鉴的地方啊。。。楼主应该重载消息OnKeyDown啊。。。如果用的只是glut那么响应的应该是那个什么keyboard的函数啊。。。我忘了叫什么了啊。。。而且没有什么所谓的一般代码啊。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式