通过Python脚本实现字符画

效果

讲解:

用于将3D视图的帧缓冲区转换为字符画,并将字符画输出到文本编辑器中。

首先,获取当前绑定的帧缓冲区、视口信息和视图像素。

然后,将像素矩阵转化为字符串,并将字符串写入到文本编辑器中。

设置文本编辑器,并添加区域OpenGL图形回调函数。

主要功能就是将3D视图的帧缓冲区转换为字符画,并将字符画输出到文本编辑器中。

可以按下 ESC 键停止运行这个python脚本。

代码:

import bpy
import gpu
import numpy as np
from mathutils import Colordef draw(self, context):if self.modal_redraw == True:# 获取当前绑定的帧缓冲区self.framebuffer = gpu.state.active_framebuffer_get()# 获取当前视口的信息self.viewport_info = gpu.state.viewport_get()self.width = self.viewport_info[2]self.height = self.viewport_info[3]# 获取视图像素self.pixelBuffer = self.framebuffer.read_color(0, 0, self.width, self.height, 3, 0, 'FLOAT')self.pixelBuffer.dimensions = self.width * self.height * 3# 处理array = np.array(self.pixelBuffer).reshape(self.height, self.width, 3)[::self.step * -2, ::self.step]# 将像素矩阵转化为字符串pixel_group = []for i in array:for j in i:pixel_group.append(self.Character_draw[int(min(Color(j).v, 1) * (len(self.Character_draw) - 1))])pixel_group.append("\n")self.framebuffer_texts.clear()self.framebuffer_texts.write("".join(pixel_group))self.modal_redraw = Falseclass TextCharacterDrawing(bpy.types.Operator):bl_idname = "view3d.text_character_drawing"bl_label = "Draw 3D View Framebuffer"def __init__(self):print("启动")self.width = 32self.height = 32self.modal_redraw = Falseself.text_name = "Generated Text"self.framebuffer = Noneself.viewport_info = Noneself.pixelBuffer = Noneself.default_texts = Noneself.framebuffer_texts = Noneself.Character_draw = list(" .(){}01A")  # 按透明度从小到大排序,字符self.step = 5  #抽取的像素数量,越高,字符越少,越低,越卡【字符也多】# 当运算符结束时,在系统控制台上提示def __del__(self):print("结束演示代码")# 控制图像重画的模态运算符def modal(self, context, event):# esc 停止if event.type in {'ESC'}:bpy.types.SpaceView3D.draw_handler_remove(self._handle_3d, 'WINDOW')# 当程序退出时回到原来的文本块area = [area for area in bpy.context.screen.areas if area.type == 'TEXT_EDITOR'][0]if area:area.spaces[0].text = self.default_textsprint("删除绘图处理程序")return {'CANCELLED'}else:self.modal_redraw = Truereturn {'PASS_THROUGH'}def invoke(self, context, event):if not self.text_name in bpy.data.texts:self.framebuffer_texts = bpy.data.texts.new(self.text_name)else:self.framebuffer_texts = bpy.data.texts[self.text_name]area = [area for area in bpy.context.screen.areas if area.type == 'TEXT_EDITOR'][0]if area:if area.spaces[0].text:self.default_texts = area.spaces[0].textarea.spaces[0].text = self.framebuffer_textswith bpy.context.temp_override(area=area):bpy.ops.text.move(type='FILE_TOP')bpy.ops.text.move(type='LINE_BEGIN')# 添加区域OpenGL图形回调函数self._handle_3d = bpy.types.SpaceView3D.draw_handler_add(draw, (self, context), 'WINDOW', 'PRE_VIEW')context.window_manager.modal_handler_add(self)return {'RUNNING_MODAL'}def register():bpy.utils.register_class(TextCharacterDrawing)def unregister():bpy.utils.unregister_class(TextCharacterDrawing)if __name__ == "__main__":register()bpy.ops.view3d.text_character_drawing('INVOKE_DEFAULT')

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

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

相关文章

bmob Harmony快速开发手机号一键登录功能

最近用Bmob的鸿蒙SDK尝试了Harmony开发,做了一个几乎每个应用都会有的功能:手机号码短信验证码一键注册登录的功能,感觉简直爽的不要不要的,ArkUI可见即可得的UI交互设计体验,配合Bmob后端云一如既往简单易用的风格&am…

使用Perplexity打造产品的27种方式

ChatGPT和Perplexity等聊天机器人正迅速成为产品经理的首选助手。以下是一份全面的指南,介绍PM如何在日常工作中使用Perplexity,该指南基于300多份回复和30次电话后的总结。 理解并制定增长战略:例如,解释增长会计的基本原理&…

【Vue】——组件之间数据的传递

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

【proteus经典实战】16X192点阵程序

一、简介 6X192点阵程序通常用于表示高分辨率图像或文字,其中16X表示像素阵列的宽度,192表示每个像素阵列中的点阵数,16X192点阵程序需要一定的编程知识和技能才能编写和调试,同时还需要考虑硬件设备的兼容性和性能等因素。 初始…

知识不成体系?这篇Mysql数据库将成为你的解忧杂货店!(子查询)

欢迎来到一夜看尽长安花 博客,您的点赞和收藏是我持续发文的动力 对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:3329759426qq.com 。发布文章的风格因专栏而异,均自成体系,不足…

网线直连电脑可以上网,网线连tplink路由器上不了网

家里wifi网络连不上好几天了,用网线直连电脑可以上网,但网线连tplink路由器wan口上不了网,无Internet连接,网线连lan口可以电脑上网,手机上不了。 后来发现网线的主路由用的192.168.0.1,我的路由器wan口自…

R包的4种安装方式及常见问题解决方法

R包的4种安装方式及常见问题解决方法 R包的四种安装方式1. install.packages()2. 从Bioconductor安装3. 从本地源码安装4. 从github安装 常见问题的解决1. 版本问题2. 网络/镜像问题3.缺少Rtools R包的四种安装方式 1. install.packages() 对于R自带的包的安装一般都可以通过…

共模和差模的基本概念

电压电流在导体或导线中传播时,存在两种工作形态:共模和差模。电子设备的信号线在进行相互通信时,至少会存在两根导线以形成电传输回路,除此之外,通常还存在第三个导体,即“参考地”。当信号正常传输时&…

c++类成员指针用法

1)C入门级小知识,分享给将要学习或者正在学习C开发的同学。 2)内容属于原创,若转载,请说明出处。 3)提供相关问题有偿答疑和支持。 c中新增类成员指针操作,为了访问方便,他是指…

Meven

目录 1.简介2.Maven项目目录结构2.1 约定目录结构的意义2.2 约定大于配置 3. POM.XML介绍3.2 依赖引用3.3 属性管理 4 Maven生命周期4.1 经常遇到的生命周期4.1 全部生命周期 5.依赖范围(Scope)6. 依赖传递6.1 依赖冲突6.2 解决依赖冲突6.2.1 最近依赖者…

鸿蒙项目实战-月木学途:1.编写首页,包括搜索栏、轮播图、宫格

效果展示 搜索栏制作 相关知识回顾 输入框组件TextInput 单行输入框类型.type(InputType.Normal)//基本输入框.type(InputType.Password)//密码.type(InputType.Email)//邮箱.type(InputType.Number)//数字.type(InputType.PhoneNumber)//电话号.type(InputType.Normal).type…

地图初始化-多视图几何基础

在ORB-SLAM2中初始化和使用的传感器类型有关,其中单目相机模式初始化相对复杂,需要运行一段时间才能成功初始化。而双目相机、 RGB-D相机模式下比较简单,一般从第一帧开始就可以完成初始化。 为什么不同传感器类型初始化差别这么大呢&#x…

spring-security安全框架(超精细版附带流程讲解图)

目录 一、回顾一下 二、security使用 2.1 覆盖掉默认配置「自定义配置」 2.2 如何自定义认证 2.3 纯纯自定义 2.4 jwt 2.5 官网认证流程 2.6 RBAC模型 4.1. 创建表结构 2.7 如何实现权限流程 一、回顾一下 security干啥的? 认证和授权 使用方式 引入依赖, 基于spri…

算法力扣刷题 二十五【28.找出字符串中第一个匹配项的下标】

前言 字符串篇,继续。 记录 二十五【28.找出字符串中第一个匹配项的下标】 一、题目阅读 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不…

C语言中的基础指针操作

在C语言中,指针是一个非常重要的概念,它提供了直接访问内存地址的能力。指针变量用于存储内存地址,而不是数据值,在某种意义上和门牌号具有相似含义:指针是一个变量,其存储的是另一个变量的内存地址&#x…

java之动态代理

1 代理模式 代理模式提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。简言之,代理模式就是设置一个中间代理来控制访问原目标…

网络io与select,poll,epoll

前言 网络 IO,会涉及到两个系统对象,一个是用户空间调用 IO 的进程或者线程,另一个是内核空间的内核系统,比如发生 IO 操作 read 时,它会经历两个阶段: 1. 等待数据准备就绪 2. 将数据从内核拷贝到进程或…

网络编程常见问题

1、TCP状态迁移图 2、TCP三次握手过程 2.1、握手流程 1、TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态; 2、TCP客户进程也是先创建传输控制块TCB&#xff…

改进经验模态分解方法-通过迭代方式(IMF振幅加权频率,Python)

一种新颖的改进经验模态分解方法-通过迭代方式(IMF振幅加权频率)有效缓解了模态混叠缺陷,以后慢慢讲,先占坑。 import numpy as np import matplotlib.pyplot as plt import os import seaborn as sns from scipy import stats i…

C语言图书管理系统控制台程序

程序示例精选 C语言图书管理系统控制台程序 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《C语言图书管理系统控制台程序》编写代码,代码整洁,规则,易读…