解决方案 »
- 请问如何在win32下实现编辑框回车触发事件?
- ATL中使用自定义数据类型作为参数!!!测试的时候报错!
- 拖动无标题的窗口,高手帮我看下吧。
- 我用VC做QQ,可是对于消息发送的校验不怎么明白,有什么好办法来进行检验消息发送正确呢?还有如何进行分包发送?谢谢谢谢!
- CDialogBar类的继承
- picture控件的应用方法?请教
- 请教大侠,在哪可以找到串口通讯的例程?
- 请问如何让一个窗体始终激活?
- 如何把拥有同一IP的不同用户区分开来????(比如网吧里)
- 请问在ActiveX容器中如何激活ActiveX控件,使它能接受消息而不能编辑
- 一个线程阻塞在accept了,主线程退出时如何通知这个线程也退出呢?
- VC修改了对话框为什么运行时没有变化
这个程序是我想绘制出来一个窗口,在这里边选择两个点,根据它们的坐标转换成直线方程。然后我的程序里要用这条直线方程作一些操作。void COpenGL::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMainFrame * pMF = (CMainFrame*)AfxGetMainWnd();
m_point2d[m_pointNum] = ScreenToGL(point);
pMF->m_cutpoints[m_pointNum] = m_point2d[m_pointNum];
HWND hWnd = GetSafeHwnd();
HDC hDC = ::GetDC(hWnd);
wglMakeCurrent(hDC, hglrc);
DrawColorBox();
SwapBuffers(hDC); // 使用双缓存
m_pointNum++;
CWnd::OnLButtonDown(nFlags, point);
}
此网格的四个顶点坐标(在opengl绘图坐标)分别是左上(-75,80)、左下(-75,-80)、右上(75,80)、右下(75,-80)。
当鼠标点击风格左上角点时,OnLButtonDown()里的point应该是{x=125,y=70}(在窗体矩形区坐标)啊,可是绘制出来的网格不在这个位置上,不知道是什么原因。 我不知道怎么发图片上来。。不然可以给你看一下效果了
.(0,0) .(400,0)
A.(-75,80)---------------B.(75,80)
| |
| |
| |
| .(0,0) |
| |
| |
| |
C.(-75,-80)--------------D.(75,-80)
.(0,300) .(400,300)就是这个样子的,呵呵 按这个效果计算:
鼠标点击A点时返回的 Point应该是 { [400-(75+75)]/2=150, [300-(80+80)]/2=70 }
可是返回的point是{x=88,y=29}...
个人觉得问题可能是出在这个语句上了:
glOrtho(-100.0, 100.0, -100.0 / m_aspect, 100.0 / m_aspect, -100, 100);
我不知道二维图形里面要不要这么设定,是在别人那里Copy来的。。
描述:这个函数描述了一个平行修剪空间。这种投影意味着离观察者较远的对象看上去不会变小(与透视投影相反)。在3D笛卡尔坐标中想象这个修剪空间,左边和右边是最小和最大的X值,上边和下边是最小和最大的Y值,近处和远处是最小和最大的Z值。
正射投影,又叫平行投影。这种投影的视景体是一个矩形的平行管道,也就是一个长方体。正射投影的最大一个特点是无论物体距离相机多远,投影后的物体大小尺寸不变。这种投影通常用在建筑蓝图绘制和计算机辅助设计等方面,这些行业要求投影后的物体尺寸及相互间的角度不变,以便施工或制造时物体比例大小正确。glOrtho就是一个正射投影函数。它创建一个平行视景体。实际上这个函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。其中近裁剪平面是一个矩形,矩形左下角点三维空间坐标是(left,bottom,-near),右上角点是(right,top,-near);远裁剪平面也是一个矩形,左下角点空间坐标是(left,bottom,-far),右上角点是(right,top,-far)。所有的near和far值同时为正或同时为负。如果没有其他变换,正射投影的方向平行于Z轴,且视点朝向Z负轴。这意味着物体在视点前面时far和near都为负值,物体在视点后面时far和near都为正值。以上我看得晕得乎的,似懂非懂glOrtho()是设置三维界面的。而我的程序里用的是二维的,所以才出现了些莫明其妙的错误。在二维界面中,设置或修改修剪空间的范围应该用gluOrtho2D();下面再对它进行一下说明: gluOrtho2D(-200,150,-150,150);参数分别代表(左下角x坐标,右上角x坐标,左下角y坐标,右上角y坐标)——坐标全相对于窗口左下角--原点),near和far默认为-1和1,此函数决定一个平行六面体,即View Volume!View Volume越大,里面的物体显得越小!如,一个点的坐标是(0,0,0)就是在平行六面体的中间,也就是在viewport的中间;又如一个点的坐标是(-200,-150,0),是在平行六面体的左下角,也就是在vieport的左下角。
注:viewport是指视窗的大小,就好像我们的眼睛!viweport可以用下面函数指定:
glViewport(左下角x坐标, 左下角y坐标, wigth, height); 默认是(0,0,窗口的宽度,窗口的高度)
可以用gluOrtho函数来指定near和far,gluOrtho(Xmin,Xmax,Ymin,Ymax,near,far);呵呵,又学到了一点儿。。同喜同喜!给大家散分。