社区
图形处理/算法
帖子详情
OpenGl 中glViewport(x,y,cx,cy)的x和y与窗口坐标有啥区别?
问远
2010-04-04 01:50:58
OpenGl 中glViewport(x,y,cx,cy)的x和y与窗口坐标有啥区别?
...全文
920
3
打赏
收藏
OpenGl 中glViewport(x,y,cx,cy)的x和y与窗口坐标有啥区别?
OpenGl 中glViewport(x,y,cx,cy)的x和y与窗口坐标有啥区别?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
VR_Lab
2010-04-07
打赏
举报
回复
glViewport(x,y,cx,cy),其中的x,y表示你要画的窗口的左上角的坐标位置,cx,cy表示你要画的窗口的长和宽。利用这个函数可以实现多视口显示,即一个窗口中“同时”显示不同的图像,我写过一个OpenGL的窗口类继承于CWnd,比如说你要把你的窗口分为4份,实现四网格显示,那在左上角的那个窗口的设置就是glViewport(0,0,width/2,heitht/2);还有不懂的可以加我QQ726436079
degree_37
2010-04-04
打赏
举报
回复
楼上正解~
Swkjd
2010-04-04
打赏
举报
回复
OpenGL:屏幕上水平向右为x,竖直向上为y,z垂直屏幕向外,与x、y构成右手坐标系。
窗口坐标:屏幕上水平向右为x,竖直向下为y。
计算机图形学制作时钟源代码
用MFC VC++实现的时钟源代码 // MFCFrame1View.cpp : implementation of the CMFCFrame1View class // #include "stdafx.h" #include "MFCFrame1.h" #include "MFCFrame1Doc.h" #include "MFCFrame1View.h" #include "PointDialog.h" #include "math.h"
GL
UquadricObj *obj
Cy
linder =
gl
uNewQuadric(); #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMFCFrame1View IMPLEMENT_DYNCREATE(CMFCFrame1View, CView) BEGIN_MESSAGE_MAP(CMFCFrame1View, CView) //{{AFX_MSG_MAP(CMFCFrame1View) ON_WM_CREATE() ON_WM_DESTROY() ON_WM_SIZE() ON_COMMAND(IDM_ZIXUAN, OnZixuan) ON_WM_TIMER() ON_COMMAND(IDM_ChangDirect, OnChangDirect) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMFCFrame1View construction/destruction CMFCFrame1View::CMFCFrame1View() { // TODO: add construction code here this->m_
GL
PixelIndex = 0; this->m_h
GL
Context = NULL; An
gl
e1=0.0; An
gl
e2=30.0; Timer=0; x=0.0; z=0.0; juli=40.0; } CMFCFrame1View::~CMFCFrame1View() { } BOOL CMFCFrame1View::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS); return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CMFCFrame1View drawing ///////////////////////////////////////////////////////////////////////////// // CMFCFrame1View printing BOOL CMFCFrame1View::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CMFCFrame1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CMFCFrame1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CMFCFrame1View diagnostics #ifdef _DEBUG void CMFCFrame1View::AssertValid() const { CView::AssertValid(); } void CMFCFrame1View::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMFCFrame1Doc* CMFCFrame1View::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCFrame1Doc))); return (CMFCFrame1Doc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMFCFrame1View message handlers BOOL CMFCFrame1View::SetWindowPixelFormat(HDC hDC) { PIXELFORMATDESCRIPTOR pixelDesc= { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW|PFD_SUPPORT_
OPEN
GL
| PFD_DOUBLEBUFFER|PFD_SUPPORT_GDI, 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 }; this->m_
GL
PixelIndex = ChoosePixelFormat(hDC,&pixelDesc); if(this->m_
GL
PixelIndex==0) { this->m_
GL
PixelIndex = 1; if(DescribePixelFormat(hDC,this->m_
GL
PixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0) { return FALSE; } } if(SetPixelFormat(hDC,this->m_
GL
PixelIndex,&pixelDesc)==FALSE) { return FALSE; } return TRUE; } int CMFCFrame1View::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here HWND hWnd = this->GetSafeHwnd(); HDC hDC = ::GetDC(hWnd); if(this->SetWindowPixelFormat(hDC)==FALSE) { return 0; } if(this->CreateView
GL
Context(hDC)==FALSE) { return 0; } return 0; } BOOL CMFCFrame1View::CreateView
GL
Context(HDC hDC) { this->m_h
GL
Context = w
gl
CreateContext(hDC); if(this->m_h
GL
Context==NULL) {//创建失败 return FALSE; } if(w
gl
MakeCurrent(hDC,this->m_h
GL
Context)==FALSE) {//选为当前RC失败 return FALSE; } return TRUE; } void CMFCFrame1View::OnDestroy() { CView::OnDestroy(); // TODO: Add your message handler code here if(w
gl
GetCurrentContext()!=NULL) { w
gl
MakeCurrent(NULL,NULL); } if(this->m_h
GL
Context!=NULL) { w
gl
DeleteContext(this->m_h
GL
Context); this->m_h
GL
Context = NULL; } } void CMFCFrame1View::OnSize(UINT nType, int
cx
, int
cy
) { CView::OnSize(nType,
cx
,
cy
); // TODO: Add your message handler code here
GL
sizei width,height;
GL
double aspect; width =
cx
; height =
cy
; if(
cy
==0) { aspect = (
GL
double)width; } else { aspect = (
GL
double)width/(
GL
double)height; }
gl
Viewport
(0,0,width,height);
gl
MatrixMode(
GL
_PROJECTION);
gl
LoadIdentity();
gl
uPerspective(40.0,aspect,5.0,1000.0); } void CMFCFrame1View::OnDraw(CDC* pDC) { CMFCFrame1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CPaintDC dc(this);
gl
ClearColor(1.0,1.0,1.0,1.0);
gl
Clear(
GL
_COLOR_BUFFER_BIT);
gl
MatrixMode(
GL
_MODELVIEW);
gl
LoadIdentity();
gl
uLookAt(0.0,0.0,10.0,0.0,0.0,0.0,0.0,1.0,0.0);
gl
Rotatef(-90.0,1.0,0.0,0.0);/*返回原
坐标
*/
gl
Translatef(-3.0,0.0,0.0); SwapBuffers(dc.m_ps.hdc);
gl
DrawBuffer (
GL
_BACK);
gl
Flush(); } void CMFCFrame1View::OnZixuan() { // TODO: Add your command handler code here Timer=1; SetTimer(1,100,NULL); } void CMFCFrame1View::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CPaintDC dc(this); if (Timer==1) { An
gl
e1=An
gl
e1-1; An
gl
e2=An
gl
e2-1;
gl
ClearColor(1.0,1.0,1.0,1.0);
gl
Clear(
GL
_COLOR_BUFFER_BIT);
gl
MatrixMode(
GL
_MODELVIEW);/**/
gl
LoadIdentity();
gl
uLookAt(0.0,20.0,0.000000001,0.0,0.0,0.0,0.0,1.0,0.0);
gl
PushMatrix();
gl
Color3f(0.7,0.7,0.7);
gl
Translatef(0.0,0.0,1.1);
gl
Rotatef(-90.0,1.0,0.0,0.0);
gl
utSolidCone(5.0,0.0,60.0,60.0); /*底盘*/
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(0.0,0.0,0.0);
gl
Translatef(3.9,0.99,1.0); /*刻度*/
gl
Rotatef(90.0,0.0,1.0,0.0);
gl
u
Cy
linder(obj
Cy
linder, 0.05, 0.05, 0.8, 9999, 9);
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(0.0,0.0,0.0);
gl
Translatef(-4.7,0.99,1.0); /*刻度*/
gl
Rotatef(90.0,0.0,1.0,0.0);
gl
u
Cy
linder(obj
Cy
linder,0.05, 0.05, 0.8, 9999, 9);
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(0.0,0.0,0.0);
gl
Translatef(0.0,0.99,-2.9); /*刻度*/
gl
Rotatef(180.0,0.0,1.0,0.0);
gl
u
Cy
linder(obj
Cy
linder,0.05, 0.05, 0.8, 9999, 9);
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(0.0,0.0,0.0);
gl
Translatef(0.0,0.99,5.8); /*刻度*/
gl
Rotatef(180.0,0.0,1.0,0.0);
gl
u
Cy
linder(obj
Cy
linder,0.05, 0.05,0.8, 9999, 9);
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(0.0,1.0,0.0);
gl
Rotatef(45.0,0.0,1.0,0.0);
gl
Translatef(-0.67,0.99,0.7); /*时针*/
gl
Rotatef(An
gl
e1/129600,0.0,1.0,0.0);
gl
u
Cy
linder(obj
Cy
linder, 0.07, 0.02, 2.5, 9999, 9);
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(1.0,0.0,0.0);
gl
Translatef(0.0,0.99,1.0); /*分针*/
gl
Rotatef(An
gl
e2/360,0.0,1.0,0.0);
gl
u
Cy
linder(obj
Cy
linder, 0.05, 0.02, 3.5, 9999, 9);
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(0.0,0.0,0.5);
gl
Translatef(0.0,0.99,1.0); /*秒针*/
gl
Rotatef(An
gl
e1,0.0,1.0,0.0);
gl
u
Cy
linder(obj
Cy
linder, 0.07, 0.02, 4.5, 9999, 9);
gl
PopMatrix(); SwapBuffers(dc.m_ps.hdc);
gl
DrawBuffer (
GL
_BACK);
gl
Flush(); } else if(Timer==2) {
gl
ClearColor(1.0,1.0,1.0,1.0);
gl
Clear(
GL
_COLOR_BUFFER_BIT); if (juli>12.0) {
gl
MatrixMode(
GL
_MODELVIEW);/*建立了从世界
坐标
系到观察
坐标
系的转换矩阵*/
gl
LoadIdentity();
gl
uLookAt(0.0,8.0,juli,0.0,0.0,0.0,0.0,1.0,0.0); juli=juli-0.1;
gl
PushMatrix();
gl
Color3f(0.0,0.0,0.0);
gl
Rotatef(-90.0,1.0,0.0,0.0);
gl
utWireCone(40.0,0.0,30.0,30.0); /*画高度为0的圆锥*/
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(1.0,0.0,1.0);
gl
LineWidth(4.0);
gl
Translatef(4.0,1.0,0.0);
gl
utWireOctahedron(); /*画八面体*/
gl
LineWidth(1.0);
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(1.0,0.0,1.0);
gl
Translatef(0.0,1.1,0.0);
gl
Rotatef(An
gl
e2,0.0,1.0,0.0);
gl
u
Cy
linder(obj
Cy
linder, 1.0, 1.0, 10.0, 9999, 9); /*画壶*/
gl
PopMatrix(); } else if(juli<=12.0) { An
gl
e2=An
gl
e2+0.01; if (An
gl
e2==360.0) An
gl
e2=0.0;
gl
MatrixMode(
GL
_MODELVIEW);/*建立了从世界
坐标
系到观察
坐标
系的转换矩阵*/
gl
LoadIdentity(); x=12.0*sin(An
gl
e2); z=12.0*cos(An
gl
e2);
gl
uLookAt(x,5.0,z,0.0,0.0,0.0,0.0,1.0,0.0);
gl
PushMatrix();
gl
Color3f(0.0,0.0,0.0);
gl
Rotatef(-90.0,1.0,0.0,0.0);
gl
utWireCone(40.0,0.0,30.0,30.0); /*画高度为0的圆锥*/
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(1.0,0.0,1.0);
gl
LineWidth(4.0);
gl
Translatef(4.0,1.0,0.0);
gl
utWireOctahedron(); /*画八面体*/
gl
LineWidth(1.0);
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(1.0,0.0,1.0);
gl
Translatef(0.0,1.1,0.0);
gl
u
Cy
linder(obj
Cy
linder, 1.0, 1.0, 10.0, 9999, 9); /*画壶*/
gl
PopMatrix(); } SwapBuffers(dc.m_ps.hdc);
gl
DrawBuffer (
GL
_BACK);
gl
Flush(); } CView::OnTimer(nIDEvent); } void CMFCFrame1View::OnChangDirect() { // TODO: Add your command handler code here Timer=2; SetTimer(1,100 ,NULL); }
open
gl
常见问题
01.相机如何在
Open
GL
中
工作?
02.我怎样才可以移动我的视点, 或者是相机,在我的场景
中
?
03.我的相机该去哪, 模型视点矩阵还是投射矩阵?
04.我该怎么执行一个缩放操作?
05.给出当前模型视点矩阵,我怎么才可以确定相机的物体空间位置?
06.我怎样才可以使照相机在我的场景
中
围绕一个点转?
07.如何自动计算一个观察点可以显示全部的场景?(我知道边界球体和向上分量(bounding sphere
浅学
Open
GL
ES2.0
一.
Open
GL
ES2.0原理浅析 1.
Open
GL
ES通过获取物体的控件顶点信息, 可以实现3维物体到2维物体的
坐标
转换输出到屏幕,并且可以对物体实现平移,旋转,缩放,而且利用着色器可编程渲染通道实现多种光学作用,特殊形状变换等效果。从而能实现丰富的物体再现功能。 2. 通过模拟人眼观察物体, 可能引起屏幕图像改变的几种行为和分别对应的几种
Open
GL
变换:
Open
GL
-旋转平移与缩放
Open
GL
里面的旋转缩放与平移其实就是
坐标
系的相关变换,不过由于初学者(像我)很容易被
Open
GL
里面各种
坐标
系搞晕而难以理解,现在将我的理解记录如下。PS: 由于学校课程要求,使用的是过时的固定管线。为了清楚地理解这三种变换,我们只关心两个
坐标
系:建模
坐标
系和世界
坐标
系。眼
坐标
之类的使用默认值。文末有一段程序代码,绘制了一个正方体,并实现了这三种变换。世界
坐标
系(WC):你现在正对绘图
窗口
,右方
Open
GL
边用边学------2
Open
GL
状态、视口设置
Open
GL
的状态管理机制 视口与视口
坐标
系概念 测试视口设置 1 移动视口 2 多视口 视口小结1
Open
GL
的状态管理机制从前面的最简单例子可以看出,我们几乎没有进行任何关于颜色和
坐标
系的配置,
Open
GL
就已经能够实施渲染了。这是因为
Open
GL
本身管理了很多渲染时需要的状态数据,并且在初始化时自动设置了合理的默认值。例如,默认的清屏颜色就是黑色,这才是我们看到
窗口
客户区呈现黑色的原因。Op
图形处理/算法
19,468
社区成员
50,698
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章