设置三角形坐标,使其充满整个手机画面(OpenGL)

本文介绍如何通过设置三角形的坐标值使其填充整个手机屏幕。通过调整平截头体参数和三角形顶点坐标,实现图形完全覆盖屏幕的效果。文中详细解释了坐标计算方法和图形显示原理。

如何设置三角形的坐标值使其填充到整个手机的画面?
平截头体的设置参数为:

gl.glFrustumf(-1f, 1f, -ratio, ratio, 3, 7);

此时的手机平面映射的应该是z=0的平面,即平截头体中心位置的平面,手机中心在原点,由此可计算手机平面(宽/2)为1,(高/2)为ratio,这个时候可得三角形各点坐标如下图所示:
这里写图片描述

可设置设置坐标值

            float[] coords = {
                    0f,ratio,0f,
                    -1f,-ratio,0f,
                    1f,-ratio,0f,
            };

所得图像如图所示:

要使用OpenGL创建窗口并设置坐标轴,首先你需要确保已经安装了适当的库,如GLFW(图形框架)用于窗口管理和基本输入,以及GLEW(OpenGL扩展加载器)来处理不同版本的OpenGL兼容性。接下来,我会提供一个简单的步骤概述。 **1. 设置环境和引入库** ```cpp #include <glad/glad.h> // GLFW 和 GLEW 的头文件 #include <GLFW/glfw3.h> #include <iostream> // 其他全局定义和函数声明 ``` **2. 初始化 GLFW** ```cpp int main() { // GLFW初始化 glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Test", NULL, NULL); if (!window) { std::cerr << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } // 将窗口回调函数连接到窗口事件上 glfwMakeContextCurrent(window); gladLoadGLLoader((GLADloadproc)glfwGetProcAddress); // 加载GL函数指针 } ``` **3. 设置坐标系和清除颜色** ```cpp void setupView() { glViewport(0, 0, static_cast<GLsizei>(glfwGetWindowSize(window).x), static_cast<GLsizei>(glfwGetWindowSize(window).y)); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, (GLfloat)glfwGetFramebufferSize(window).x / (GLfloat)glfwGetFramebufferSize(window).y, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glEnable(GL_DEPTH_TEST); // 开启深度测试 } ``` **4. 绘制坐标轴** ```cpp void drawAxis() { float axisLength = 5.0f; glColor3f(0.0f, 1.0f, 0.0f); // X轴绿色 glBegin(GL_LINES); glVertex3f(-axisLength, 0, 0); glVertex3f(axisLength, 0, 0); glEnd(); glColor3f(0.0f, 0.0f, 1.0f); // Y轴蓝色 glBegin(GL_LINES); glVertex3f(0, -axisLength, 0); glVertex3f(0, axisLength, 0); glEnd(); glColor3f(1.0f, 0.0f, 0.0f); // Z轴红色 glBegin(GL_LINES); glVertex3f(0, 0, -axisLength); glVertex3f(0, 0, axisLength); glEnd(); } ``` **5. 绘制三角形** ```cpp void drawTriangle() { GLfloat vertices[] = { // 顺时针排列 -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f }; GLuint vboID; // Vertex Buffer Object ID glGenBuffers(1, &vboID); glBindBuffer(GL_ARRAY_BUFFER, vboID); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(0); glDrawArrays(GL_TRIANGLES, 0, 3); // 画一个三角形 glBindBuffer(GL_ARRAY_BUFFER, 0); glDeleteBuffers(1, &vboID); } ``` **6. 渲染循环** ```cpp while (!glfwWindowShouldClose(window)) { setupView(); drawAxis(); drawTriangle(); glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); return 0; } ``` **相关问题--:** 1. GLFW是什么,它在OpenGL开发中的作用是什么? 2. 如何在OpenGL设置视口和模型视图矩阵? 3. 为什么在渲染三角形前要调用`setupView()`? 4. 为什么要使用Vertex Buffer Objects (VBOs)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值