wayland(xdg_wm_base) + egl + opengles 渲染旋转的 3D 立方体实例(十一)

文章目录

  • 前言
  • 一、实现旋转的3D 立法体需要用到的技术
    • 1. 模型矩阵
    • 2. 视图矩阵
    • 3. 投影矩阵
    • 4. 背面剔除
  • 二、opengles3.0 渲染旋转的 3D 立方体实例
    • 1. egl_wayland_cube3_0.c
    • 2. Matrix.h 和 Matrix.c
    • 3. xdg-shell-client-protocol.h 和 xdg-shell-protocol.c
    • 4. 编译
    • 5. 运行
  • 总结
  • 参考资料


前言

本文主要介绍如果使用 wayland(xdg_wm_base) + egl + opengles3.0 绘制一个绕Y轴旋转的正方体,涉及顶点坐标变化,模型,视图,投影矩阵等相关内容
软硬件环境:
硬件:PC
软件:ubuntu22.04 egl1.4 opengles3.0 weston9.0


一、实现旋转的3D 立法体需要用到的技术

绘制一个绕Y轴旋转的正方体,涉及顶点坐标变化,模型,视图,投影矩阵以及背面剔除等相关内容

1. 模型矩阵

要实现旋转,故需要使用一个矩阵来实现,在这里直接使用Matrix.c 中封装好的如下接口即可

matrixRotateX(modelMatrix, angleX);
matrixRotateY(modelMatrix, angleY);
matrixRotateZ(modelMatrix, angleZ);

2. 视图矩阵

默认的视点是在坐标(0,0,0)处(即在立方体内部),为了看到立方体的全貌,需要将视点沿着Z轴正方向移动(移动到立方体外面),也需要使用一个矩阵来实现,在这里直接使用Matrix.c 中封装好的如下接口即可

matrixTranslate(viewMatrix, 0.0f, 0.0f, -7.0f);       //视点沿着Z轴移动到Z坐标为7处

移动的距离越远,立方体看上去会越小,出现缩放的效果

3. 投影矩阵

由于使用视图矩阵将视点移动到Z坐标为7(7 大于1,超出了可视范围)处,故需要使用投影矩阵,否则会看不到立方体,也需要使用一个矩阵来实现,在这里直接使用Matrix.c 中封装好的如下接口即可

/* Setup the perspective */matrixPerspective(projectionMatrix, 45, (float)width / (float)height, 0.1f, 100);    //角度为45°

4. 背面剔除

opengles3.0 默认背面剔除功能是关闭的,需要使能, 否则立方体的正面会不显示(透视),直接调用如下语句即可

glEnable(GL_CULL_FACE);         //enable back face cull

这里需要注意一下,在OpenGLES中,所绘制的图形是通过一个个的三角形组合成的。OpenGLES通过分析顶点数据的顺序得知哪些面是正面、哪些面是背面。默认规则:
正面:按照逆时针顶点连接顺序的三角形面
背面:按照顺时针顶点连接书序的三角形面
顺时针或逆时针:由观察者的方向来确定

正面和背面是由三角形的顶点顺序和观察者方向共同决定的,随着观察者的角度变化,正背面也会跟着改变,这也与现实中的情况相吻合。

二、opengles3.0 渲染旋转的 3D 立方体实例

1. egl_wayland_cube3_0.c

egl_wayland_cube3_0.c 代码如下:

#include <wayland-client.h>
#include <wayland-server.h>
#include <wayland-egl.h>
#include <EGL/egl.h>
#include <GLES3/gl3.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Matrix.h"
#include "xdg-shell-client-protocol.h"#define WIDTH 800
#define HEIGHT 600struct wl_display *display = NULL;
struct wl_compositor *compositor = NULL;
struct xdg_wm_base *wm_base = NULL;
struct wl_registry *registry = NULL;struct window {struct wl_surface *surface;struct xdg_surface *xdg_surface;struct xdg_toplevel *xdg_toplevel;struct wl_egl_window *egl_window;
};//opengles global varGLuint projectionLocation;
GLuint modelLocation;
GLuint viewLocation;
GLuint simpleCubeProgram; float projectionMatrix[16];
float modelMatrix[16];
float viewMatrix[16];
float angleX = 30.0f;
float angleY = 0.0f;
float angleZ = 0.0f;static void
xdg_wm_base_ping(void *data, struct xdg_wm_base *shell, uint32_t serial)
{xdg_wm_base_pong(shell, serial);
}/*for xdg_wm_base listener*/
static const struct xdg_wm_base_listener wm_base_listener = {xdg_wm_base_ping,
};/*for registry listener*/
static void registry_add_object(void *data, struct wl_registry *registry, uint32_t name, const char *interface, uint32_t version) 
{if (!strcmp(interface, "wl_compositor")) {compositor = wl_registry_bind(registry, name, &wl_compositor_interface, 1);} else if (strcmp(interface, "xdg_wm_base") == 0) {wm_base = wl_registry_bind(registry, name,&xdg_wm_base_interface, 1);xdg_wm_base_add_listener(wm_base, &wm_base_listener, NULL);}
}void registry_remove_object(void *data, struct wl_registry *registry, uint32_t name) 
{}static struct wl_registry_listener registry_listener = {registry_add_object, registry_remove_object};static void
handle_surface_configure(void *data, struct xdg_surface *surface,uint32_t serial)
{//struct window *window = data;xdg_surface_ack_configure(surface, serial);//window->wait_for_configure = false;
}static const struct xdg_surface_listener xdg_surface_listener = {handle_surface_configure
};static void
handle_toplevel_configure(void *data, struct xdg_toplevel *toplevel,int32_t width, int32_t height,struct wl_array *states)
{
}static void
handle_toplevel_close(void *data, struct xdg_toplevel *xdg_toplevel)
{
}static const struct xdg_toplevel_listener xdg_toplevel_listener = {handle_toplevel_configure,handle_toplevel_close,
};bool initWaylandConnection()
{	if ((display = wl_display_connect(NULL)) == NULL){printf("Failed to connect to Wayland display!\n");return false;}if ((registry = wl_display_get_registry(display)) == NULL){printf("Faield to get Wayland registry!\n");return false;}wl_registry_add_listener(registry, &registry_listener, NULL);wl_display_dispatch(display);if (!compositor){printf("Could not bind Wayland protocols!\n");return false;}return true;
}bool initializeWindow(struct window *window)
{initWaylandConnection();window->surface = wl_compositor_create_surface (compositor);window->xdg_surface = xdg_wm_base_get_xdg_surface(wm_base, window->surface);if (window->xdg_surface == NULL){printf("Failed to get Wayland xdg surface\n");return false;} else {xdg_surface_add_listener(window->xdg_surface, &xdg_surface_listener, window

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/709162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统---nginx(4)负载均衡

目录 1、服务器配置指令 ​编辑 1.1 服务器指令表 1.2 服务器指令参数 2、负载均衡策略指令 2.1 轮询 &#xff08;1) 加权轮询 &#xff08;2) 平滑轮询 2.2 URL 哈希&#xff08;一致性哈希&#xff09; 2.3 IP哈希策略 2.4 最少连接 Nginx 负载均衡是由代理模块和上…

OpenGL调用窗口,方向键和鼠标

9.2 OpenGL调用窗口&#xff0c;方向键和鼠标 9.2.1 opengl调用窗口 OpenGL调用窗口步骤&#xff1a; 第一步&#xff1a;初始化 GLFW&#xff0c;初始化OpenGL,初始化窗口&#xff0c;初始化上下文 第二步&#xff1a;设置窗口大小和位置&#xff0c;设置输入输出 第三步…

uniapp画图qiun-data-charts

引用&#xff1a;https://blog.csdn.net/LW0512/article/details/124857592

【STM32】STM32学习笔记-WDG看门狗(46)

00. 目录 文章目录 00. 目录01. WDG简介02. IWDG概述03. IWDG框图04. IWDG键寄存器05. WWDG简介06. WWDG框图07. WWDG工作特性08. IWDG和WWDG对比09. 预留10. 附录 01. WDG简介 WDG&#xff08;Watchdog&#xff09;看门狗 看门狗可以监控程序的运行状态&#xff0c;当程序因为…

华为OD技术面试案例2-2024年

软开C&#xff0c;机考满分&#xff0c;技术面面评两个A&#xff0c;时间线如下&#xff1a; 01.04 笔试链接 01.10 笔试(2.5h) 01.11 综测 01.13 资格面(HR面) 01.17 技术一面 01.19 技术二面 01.20 主管面 01.22 提Offer及审批 01.26 Offer邮件 笔试复盘 1.英文输入…

嵌入式烧录报错:板端IP与PC的IP相同

报错&#xff1a; 配置 实际上我配置并没有错。 服务器IP&#xff08;就是本机&#xff09;、板端IP、网关。此处网关必须与板子IP配套&#xff08;可以不存在&#xff09;。 解决 我网卡配置了多个IP。一番删除添加还是报错。 于是点击服务器IP&#xff0c;换成别的&#x…

鸿蒙OS应用编程实战:构建未来应用的基石

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 引言 鸿蒙OS&#xff08;HarmonyOS&#xff0…

前后端分离跨域问题总结

进行前后端分离开发联调时&#xff0c;网络常常会出现问题&#xff0c;可能后端确实做了跨域处理&#xff0c;但是前端还是跨域。一些其他的解决方法。 预检跨域 Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ head…

CentOS7如何使用Docker部署Wiki.Js知识库并实现公网远程访问?

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上&#xff0c;我们都需要通过某种方式来有条理的组织相应的知识架构&#xff0c;那么一个好的知识整…

网络工程师笔记4

协议 端口号 FTP 21、20 HTTP 80 Telnet 23 SMTP 25 TCP头部 TCP三次握手 TCP重传机制&#xff1a;超…

git merge refusing to merge unrelated histories

前言 本地新建了 一个新的git仓库 然后开始开发 然后 gitlab上 才去 新建了这个git仓库 初始化了master分支 同时新建了README.md文件 最后想把 本地的master 同步到gitlab的master上 提示 refusing to merge unrelated histories 翻译一下就是 拒绝合并不相关的历史 分析 提…

【ArcPy】验证输入字段是否有效

实例展示 代码 def __init__(self):self.parameters arcpy.GetParameterInfo() def updateMessages(self):if(self.parameters[0].value and self.parameters[1].value):shpPathself.parameters[0].valueAsTextfileNameself.parameters[1].valueAsTextworkspacearcpy.Describe…

Python 使用 PyRTL库 实现FPGA板卡仿真验证

要使用 Python 结合 PyRTL 库实现 FPGA 板卡的仿真验证&#xff0c;您可以利用 PyRTL 提供的硬件描述语言和仿真功能来进行 FPGA 设计的验证。下面我将为您介绍一个简单的示例&#xff0c;演示如何使用 PyRTL 库进行 FPGA 设计的仿真验证。 ### 步骤概述 1. **编写 PyRTL 硬件…

仿牛客网项目---用户注册登录功能的实现

从今天开始我们来写一个新项目&#xff0c;这个项目是一个完整的校园论坛的项目。主要功能模块&#xff1a;用户登录注册&#xff0c;帖子发布和热帖排行&#xff0c;点赞关注&#xff0c;发送私信&#xff0c;消息通知&#xff0c;社区搜索等。这篇文章我们先试着写一下用户的…

如何在群晖NAS中开启FTP服务并实现公网环境访问内网服务

文章目录 1. 群晖安装Cpolar2. 创建FTP公网地址3. 开启群晖FTP服务4. 群晖FTP远程连接5. 固定FTP公网地址6. 固定FTP地址连接 本文主要介绍如何在群晖NAS中开启FTP服务并结合cpolar内网穿透工具&#xff0c;实现使用固定公网地址远程访问群晖FTP服务实现文件上传下载。 Cpolar内…

SHARE 100M PRO:航测新高度,精准捕捉每一帧

SHARE 100M PRO&#xff1a;单镜头航测相机的革新&#xff0c;巡检效率与精度的新标杆 在航测和巡检领域&#xff0c;精确的数据采集对于确保项目成功至关重要。SHARE 100M PRO&#xff0c;作为一款单镜头航测相机&#xff0c;以其卓越的性能和创新技术&#xff0c;正在重新定…

【活动】前端世界的“祖传代码”探秘:从古老魔法到现代重构

作为一名前端工程师&#xff0c;我时常在项目中邂逅那些被岁月打磨过的“祖传代码”。它们就像古老的魔法书页&#xff0c;用HTML标签堆砌起的城堡、CSS样式表中的炼金术&#xff0c;以及JavaScript早期版本中舞动的符咒。这些代码承载着先驱们的探索精神和独特智慧&#xff0c…

智慧应急:构建全方位、立体化的安全保障网络

一、引言 在信息化、智能化快速发展的今天&#xff0c;传统的应急管理模式已难以满足现代社会对安全保障的需求。智慧应急作为一种全新的安全管理模式&#xff0c;旨在通过集成物联网、大数据、云计算、人工智能等先进技术&#xff0c;实现对应急事件的快速响应、精准决策和高…

基于C语言的TCP通信简单demo

上代码 服务端Server #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <errno.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <arpa/inet.h> #include <n…

Linux读写锁相关函数及操作

读写锁&#xff1a; 概念&#xff1a;读写锁也叫共享-独占锁。当读写锁以读模式锁住时&#xff0c;它是以共享模式锁住的&#xff1b;当它以写模式锁住时&#xff0c;它是以独占模式锁住的。&#xff08;写独占&#xff0c;读共享&#xff09;。 读写锁使用场所&#xff1a; …