Python的3D可视化库vedo 1-3 (visual模块)网格对象的线和面、图片的属性

文章目录

  • 4 MeshVisual
    • 4.1 线条
      • 4.1.1 线宽和颜色
      • 4.1.2 线条渲染为管
    • 4.2 曲面
      • 4.2.1 物体展示为实心或框架
      • 4.2.2 曲面插值
      • 4.2.3 面的剔除
    • 4.3 纹理
    • 4.4 相机跟随
  • 5 ImageVisual
    • 5.1 图片属性
      • 5.1.1 占用内存大小
      • 5.1.2 颜色标量范围
    • 5.2 渲染属性
      • 5.2.1 透明度
      • 5.2.2 亮度
      • 5.2.3 对比度

visual子模块包含了管理对象及其属性的可视化和外观的基类。
本文对visual模块的2个基类 MeshVisualImageVisual封装的方法做学习和测试。
MeshVisual是网格对象 Mesh的基类,几乎所有的3D立体图形都是 Mesh或是它的子类。
ImageVisualImage的基类,在需要往3D场景中放置2D图片时会使用 Image读取和显示图片。

4 MeshVisual

网格对象的可视化控制。

4.1 线条

4.1.1 线宽和颜色

c.linewidth(lw=None)
c.lw(linewidth=None)
设置或获取网格对象边线的线宽。

c.linecolor(lc=None)
c.lc(linecolor=None)
设置或获取网格对象边线的颜色。

c = vedo.Cube()
print(c.linewidth())
print(c.linecolor())

默认的线宽为1,线条颜色是黑色:

1.0
[0. 0. 0.]

4.1.2 线条渲染为管

c.render_lines_as_tubes(value=True)
可视化时,在线周围包裹管。这个效果在线条较粗时才能明显看到。

# 正方体的线渲染为管
c1 = vedo.Cube().wireframe().render_lines_as_tubes().lw(40)
# 正方体的线
c2 = vedo.Cube().wireframe().lw(40)
vedo.show(c1, c2, N=2)

线条渲染为管

4.2 曲面

4.2.1 物体展示为实心或框架

c.wireframe(value=True)
把网格对象表示为线框或实心的外观。

下图上侧为实心物体,下侧为用wireframe方法创建的框架物体:
实心和框架外观

4.2.2 曲面插值

c.flat()
栅格化多边形,不做曲面插值。
c.phong()
使用冯氏算法做曲面插值。它会在栅格化的多边形上内插表面法线,并根据内插法线和反射模型计算像素颜色。默认是该方式。

比较二者区别:

# 栅格化
s1 = vedo.Sphere(res=10, r=0.7).flat()
# 冯氏算法插值
s2 = vedo.Sphere(res=10, r=0.7).phong()
vedo.show([(s1, vedo.Text2D("flat")), (s2, vedo.Text2D("phong"))], N=3)

2种曲面插值方式

4.2.3 面的剔除

c.backface_culling(value=True)
背面剔除。
c.frontface_culling(value=True)
正面剔除。

绘制实心的图像时,构成图像的多边形,有一部分面向相机可以被看到,另一部分在背后看不到。
如一个正方体,不管相机在哪个方向,最多只能看到它的三个面。
另外三个看不到的面没有必要绘制。将看不到的面剔除(不进行绘制),可以提高程序的效率。

背面剔除和正面剔除的原理是根据多边形的法线相对于相机的方向进行判断和剔除。

# 两个正方体的透明度都是0.5
# 正常正方体
c1 = vedo.Cube(alpha=0.5)
# 背面剔除的正方体
c2 = vedo.Cube(alpha=0.5).backface_culling()
# 正面剔除的正方体
c3 = vedo.Cube(alpha=0.5).frontface_culling()vedo.show([(c1, vedo.Text2D("normal", s=2)),(c2, vedo.Text2D("backface_culling", s=2)),(c3, vedo.Text2D("frontface_culling", s=2))], N=3)

背后的多边形本身无法被看到,只有在前面的多边形设置透明度的时候才能发现背后的多边形是否被绘制。
背面剔除和正面剔除
c.backcolor(bc=None)
c.bc(backcolor=None)
设置网格对象背面的颜色。
实际操作无效果。

4.3 纹理

c.texture()
为网格对象设置纹理。可以由图片文件设置或使用预设的纹理。
参数如下:

  • tname,将被应用的纹理。填None会禁用纹理。可以填numpy数组、图片文件路径或vedo的Image对象。
  • tcoords=None,uv纹理坐标数组。也可以写网格对象中现有的数组名称。
  • interpolate=None,渲染时是否开启纹理映射的线性插值。
  • repeat=None,是否在tcoords超过[0,1]范围后,重复纹理。
  • edge_clamp=False,在纹理坐标超过[0,1]范围后,是否开启纹理环绕。只有在repeat=False且显卡支持纹理环绕时才可以用。
  • scale=None,缩放纹理图片;
  • ushift=None,移动纹理的U坐标;
  • vshift=None,移动纹理的V坐标;

vedo提供了17种纹理图片,官网位置:https://vedo.embl.es/examples/data/textures/。
或者去这里下载:https://download.csdn.net/download/qq_42783188/90050775。
展示这些纹理的效果:

# 可以使用url,需要即时下载,慢
# textures_path = vedo.dataurl + 'textures/{}.jpg'
# 使用本地路径很快
textures_path = ".../{}.jpg"
texture_list = ['gold', 'grass', 'leather', 'water', 'clouds','white', 'paper1', 'paper2', 'paper3', 'paper4','marble', 'bricks', 'wood1', 'wood2', 'wood3',# 'earth0', 'earth1',
]cubes = []
for t in texture_list:# 15种纹理使用立方体展示c = vedo.Cube().texture(textures_path.format(t))# 2种纹理使用球体展示# c = vedo.Sphere().texture(textures_path.format(t))txt = vedo.Text2D(t)cubes.append((c, txt))vedo.show(cubes, N=15).close()
# vedo.show(cubes, N=2).close()

15种纹理
2种地球纹理

4.4 相机跟随

c.follow_camera(camera=None, origin=None)
设置物体跟随相机移动的对象。c.follow_camera(False)可以禁用该特性。

比较两种模式:

# 红色的跟随相机移动
c1 = vedo.Cube(c="red")
c1.follow_camera()
# 绿色的不跟随相机移动
c2 = vedo.Cube(c="green")
c2.follow_camera(False)
vedo.show(c1, c2)

绿色正方体被拖拽会改变方向,红色正方体的正面始终朝向相机。
相机跟随


5 ImageVisual

2D图片在场景中的可视化控制。

5.1 图片属性

5.1.1 占用内存大小

c.memory_size()
返回对象的内存占用大小,单位为字节。

5.1.2 颜色标量范围

c.scalar_range()
返回图片的标量范围。

5.2 渲染属性

5.2.1 透明度

c.alpha(a=None)
设置或获取图像在渲染时的透明度。

5.2.2 亮度

c.level(value=None)
获取或设置图像在渲染时的颜色亮度。

5.2.3 对比度

c.window(value=None)
获取或设置图像在渲染时的颜色对比度。

读取一个纹理图片,查看其上述属性并展示:

img = vedo.Image(".../earth1.jpg")
print("memory_size", img.memory_size())
print("scalar_range", img.scalar_range())
print("alpha", img.alpha())
print("level", img.level())
print("window", img.window())
vedo.show(img)
memory_size 1465
scalar_range [  0. 255.]
alpha 1.0
level 127.5
window 255.0

展示2D图片
三个属性alphalevelwindow的效果比较:
alpha属性
level属性
window属性

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

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

相关文章

基于JAVA的旅游网站系统设计

摘要 随着信息技术和网络技术的迅速发展,人们的生活质量和观念也在发生着改变,各地争相发展旅游业,传统的 旅游社已经无法满足人们的需求,旅游网站将突破传统在时间和地域的限制,成为方便、快捷、安全、可靠的旅游 方…

H5游戏出海如何获得更多增长机会?

海外H5小游戏的崛起给了国内众多中小厂商出海发展的机会,开发者如何在海外市场获得更多的增长机会?#APP出海# H5游戏如何在海外获得核心用户? HTML5游戏的开发与运营者们首先可以利用量多质高的HTML5游戏,维持海外用户粘性&…

国际荐酒师Peter助力第六届地博会,推动地理标志产品国际化发展

国际荐酒师Peter Lisicky助力第六届知交会暨地博会,推动地理标志产品国际化发展 第六届粤港澳大湾区知识产权交易博览会暨国际地理标志产品交易博览会于2024年12月9日至11日在中新广州知识城盛大举行,吸引了全球众多行业专家、企业代表及相关机构齐聚一…

2024 亚马逊云科技re:Invent:Werner Vogels架构哲学,大道至简 六大经验助力架构优化

在2024亚马逊云科技re:Invent全球大会第四天的主题演讲中,亚马逊副总裁兼CTO Dr.Werner Vogels分享了 The Way of Simplexity,繁简之道,浓缩了Werner在亚马逊20年构建架构的经验。 Werner表示,复杂性总是会“悄无声息”地渗透进来…

ThinkPHP框架审计--基础

基础入门 搭建好thinkphp 查看版本方法,全局搜version 根据开发手册可以大致了解该框架的路由 例如访问url http://127.0.0.1:8094/index.php/index/index/index 对应代码位置 例如在代码下面添加新方法 那么访问这个方法的url就是 http://127.0.0.1:8094/index.…

如何在vue中使用ECharts

一. 打开ECharts官网,点击快速入门 下面是ECharts官网的链接 https://echarts.apache.org/ 二.在vue中使用 1.首先先引入Echarts js文件 如下图,下面的第一张图片是官网的实现,第二章图片是我根据官网的实现 2.给ECharts 创建一个DOM容器 3. 使用ec…

网络原理之 IP 协议

目录 1. IP 协议报文格式 2. 网段划分 3. 地址管理 1) 动态分配 2) NAT 机制 (网络地址转换) 3) IPv6 4. 路由选择 1. IP 协议报文格式 IP 协议是网络层的重点协议。 网络层要做的事情,主要就是两方面: 1) 地址管理 制定一系列的规则&#xff…

HyperMesh CFD功能详解:后处理功能Part 2

Clips Clips 按钮包含两个工具。Box Clip用于空间上的裁剪,Scalar Clip可以根据物理量的范围裁剪。 示例:Box Clips 裁剪 示例:Scalar Clips 裁剪 通过裁剪,仅显示density范围是10~20的等值面 示例:显示效果控制 部分透…

Java项目实战II基于微信小程序的跑腿系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在快节奏的现代生活中&…

【机器学习与数据挖掘实战案例01】基于支持向量回归的市财政收入分析

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支,专注于让计算机系统通过数据学习和改进。它利用统计和计算方法,使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数…

JavaEE 【知识改变命运】03 多线程(3)

文章目录 多线程带来的风险-线程安全线程不安全的举例分析产出线程安全的原因:1.线程是抢占式的2. 多线程修改同一个变量(程序的要求)3. 原子性4. 内存可见性5. 指令重排序 总结线程安全问题产生的原因解决线程安全问题1. synchronized关键字…

【力扣】409.最长回文串

问题描述 思路解析 因为同时包含大小写字母,直接创建个ASCII表大小的桶来标记又因为是要回文子串,所以偶数个数的一定可以那么同时,对于出现奇数次数的,我没需要他们的次数-1,变为偶数,并且可以标记出现过…

计算机视觉在科学研究(数字化)中的实际应用

计算机视觉是一种利用计算机技术来解析和理解图像和视频的方法。.随着计算机技术的不断发展,计算机视觉被广泛应用于科学研究领域,为科学家提供了无限的可能。 一、生命科学领域 在生命科学领域,计算机视觉被广泛用于图像识别、分类和测量等…

springboot381银行客户管理系统(论文+源码)_kaic

摘 要 伴随着信息技术与互联网技术的不断发展,人们进到了一个新的信息化时代,传统管理技术性没法高效率、容易地管理信息内容。为了实现时代的发展必须,提升管理高效率,各种各样管理管理体系应时而生,各个领域陆续进到…

软件漏洞印象

软件漏洞印象 软件安全性检测 软件安全静态分析:学术界一度十分热衷的偏理论性方法软件漏洞动态挖掘,工程界普遍采用动态漏洞挖掘方式,即Fuzz技术,也称为模糊测试 漏洞利用 vs. 漏洞修复 对于已发现的软件漏洞 黑客会基于Meta…

计算机网络 —— HTTPS 协议

前一篇文章:计算机网络 —— HTTP 协议(详解)-CSDN博客 目录 前言 一、HTTPS 协议简介 二、HTTPS 工作过程 1.对称加密 2.非对称加密 3.中间人攻击 4.引入证书 三、HTTPS 常见问题 1.中间人能否篡改证书? 2.中间人能否调…

定点数的乘除运算

原码一位乘法 乘积的符号由两个数的符号位异或而成。(不参与运算)被乘数和乘数均取绝对值参与运算,看作无符号数。乘数的最低位为Yn: 若Yn1,则部分积加上被乘数|x|,然后逻辑右移一位;若Yn0&…

数据挖掘:一、Weka软件的基本操作

实验目的和要求 了解Weka软件的使用 实验环境 Windows11 Weka3.8.6 实验内容与过程 实验内容 1、了解Weka使用的一般步骤 2、利用Weka,对数据集进行关联规则挖掘及数据分类 3、记录操作步骤、使用的数据、最终的结果 实验过程 首先打开weka下载官网,选择合适

【从零开始的LeetCode-算法】383. 赎金信

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1: 输入&#…

【第二十四周】从大语言模型到多模态大模型的发展

摘要 大语言模型(Large Language Model, LLM)是指一类基于深度学习的人工智能系统,它们被设计用来理解和生成自然语言。这些模型通常是在大量的文本数据上进行训练的,通过学习文本中的模式和结构,它们能够执行各种各样…