9

mfc+opengl画几何图形,屏幕坐标与OpenGl坐标关系。

 3 years ago
source link: https://bbs.csdn.net/topics/399173543
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

mfc+opengl画几何图形,屏幕坐标与OpenGl坐标关系。

我按照网上的例子,画了这样一个图形。如下图:

对应的OpenGL函数是这样:
glTranslatef(0.0f, 0.0f, -6.0f);  //移动物体到显示区  
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);   //以边线方式绘制三角形  
//绘制3个三角形的三个顶点  
glBegin(GL_TRIANGLES);
glVertex3f(-0.6f, 0.0f, 0.0f);
glVertex3f(0.6f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.15f, 0.6f);

glVertex3f(-0.6f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.15f, 0.6f);
glVertex3f(0.0f, 0.9f, 0.6f);

glVertex3f(0.0f, 0.9f, 0.6f);
glVertex3f(0.0f, 0.15f, 0.6f);
glVertex3f(0.6f, 0.0f, 0.0f);
glEnd();
关键的是glVertex3f(x,y,z);
这个数值跟屏幕当中的屏幕坐标的关系,想请教这方面的朋友。
我在三角形顶部这里鼠标单击,获取的坐标数值是:如下图所示:

我就想知道,现在我想鼠标任意的画线,这个坐标点确定了,如何转换成opengl的坐标数值,包括模型的坐标值。

// 目标:测试OpenGL窗口视口坐标  
// 结果:glutInitWindowSize(640, 480); 指定的是windows概念中窗口(看得见,可移动,
//       最大化,最小化等操作)大小,以像素为单位 . 
//       OpenGL中的窗口和视口是逻辑上的概念,其中窗口范围是画图时指定顶点坐标使用的坐标,
//       而视口范围是将windows中概念中实际窗口映射成的范围  

#define GLUT_DISABLE_ATEXIT_HACK  

void myInit(void)  
{  
    glClearColor(1.0, 1.0, 1.0, 0.0);     // 设置背景色为白色  
    glColor3f(0.0f, 0.0f, 0.0f);          // 绘图颜色为黑色  
    glPointSize(4.0);                     // 设置点大小为4x4像素  

// 1. 如果不做任何处理,OpenGL默认坐标范围为 x=[-1,1]  y=[-1,1]  
    // 2. 只指定世界窗口坐标范围,默认视口坐标范围与世界窗口一样,按世界窗口绘图即可  
    /*glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0.0, 500, 0.0, 100);*/  
    // 3. 同时指定世界窗口坐标和视口范围,会发生从世界窗口坐标转换为视口坐标,按世界窗口绘图即可  
    glMatrixMode(GL_PROJECTION);  
    glLoadIdentity();  
    gluOrtho2D(-2, 2, -1, 1);  
    glViewport(73, -250, 11, 100);  
}  
引用 1 楼 schlafenhamster 的回复:

// 目标:测试OpenGL窗口视口坐标  
// 结果:glutInitWindowSize(640, 480); 指定的是windows概念中窗口(看得见,可移动,
//       最大化,最小化等操作)大小,以像素为单位 . 
//       OpenGL中的窗口和视口是逻辑上的概念,其中窗口范围是画图时指定顶点坐标使用的坐标,
//       而视口范围是将windows中概念中实际窗口映射成的范围  

#define GLUT_DISABLE_ATEXIT_HACK  

void myInit(void)  
{  
    glClearColor(1.0, 1.0, 1.0, 0.0);     // 设置背景色为白色  
    glColor3f(0.0f, 0.0f, 0.0f);          // 绘图颜色为黑色  
    glPointSize(4.0);                     // 设置点大小为4x4像素  

// 1. 如果不做任何处理,OpenGL默认坐标范围为 x=[-1,1]  y=[-1,1]  
    // 2. 只指定世界窗口坐标范围,默认视口坐标范围与世界窗口一样,按世界窗口绘图即可  
    /*glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0.0, 500, 0.0, 100);*/  
    // 3. 同时指定世界窗口坐标和视口范围,会发生从世界窗口坐标转换为视口坐标,按世界窗口绘图即可  
    glMatrixMode(GL_PROJECTION);  
    glLoadIdentity();  
    gluOrtho2D(-2, 2, -1, 1);  
    glViewport(73, -250, 11, 100);  
}  

可否转换呢?给一个提示。

搜索
OpenGL视口变换

引用 3 楼 schlafenhamster 的回复:

搜索
OpenGL视口变换

网上的代码写进去,基本上没有结果。

我想鼠标任意的画线 
因为 投影的 问题
2D 的 可以 做
3D 的 不行

引用 5 楼 schlafenhamster 的回复:

我想鼠标任意的画线 
因为 投影的 问题
2D 的 可以 做
3D 的 不行

2D的也可以,能否提供一个最简单例子。

关键在 鼠标 取的 点 和 窗口 一致
void main (int argc, char** argv)
{
glutInit (&argc, argv);
glutInitWindowPosition (180,180);// window
glutInitWindowSize (WIN_WIDTH,WIN_HEIGHT);// client
glutCreateWindow("triangle");
//  投影
init();

// printf ("Press 1 to 9");
// glutKeyboardFunc(keyFcn);
glutMouseFunc(mouse);
glutDisplayFunc(pointTriangle);
    glutIdleFunc(pointTriangle);
glutMainLoop();
}

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
//
#include "glut.h"
//
#define WIN_WIDTH 600
#define WIN_HEIGHT 600

//GLint number = 1;
GLfloat pt1[2] = {300,200};// 
GLfloat pt2[2] = {100,400};//
GLfloat pt3[2] = {500,400};

void init (void)
{
glClearColor (1.0, 1.0, 1.0, 0.0);
glMatrixMode (GL_PROJECTION);
//  投影 和窗口 一致
gluOrtho2D(0.0, WIN_WIDTH, 0.0, WIN_HEIGHT);
}
检查 点的位置
void mouse(int button, int state, int x, int y)  
{  
    if (button == GLUT_LEFT_BUTTON)  
    {  
        if (state == GLUT_DOWN)  
        {  
            printf("left x=%d y=%d\n",x,WIN_HEIGHT-y);  
        }  
    }  
}  

绘制 函数
void pointTriangle (void)
{
glPointSize(5);
glClear (GL_COLOR_BUFFER_BIT);
// green point are covered by 
glColor3f (0.0, 1.0, 0.0);// green
glBegin (GL_POINTS);// .     .
                    //    .
glVertex2fv (pt2);// {200,400} x=200 y=400
glVertex2fv (pt3);// {600,400} x=600 y=400
glVertex2fv (pt1);// {400,200} x=400 y=200
glEnd ();
glColor3f (1.0, 0.0, 0.0);// red
glBegin(GL_LINES);
glVertex2fv (pt2);
glVertex2fv (pt3);
//
glVertex2fv (pt3);
glVertex2fv (pt1);
//
glVertex2fv (pt1);
glVertex2fv (pt2);
glEnd();
//
glFlush();
}

匿名用户不能发表回复!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK