通过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…

MySQL触发器教程(02):创建删除后触发器

文章目录 介绍语法使用场景示例创建students表创建scores表创建删除触发器 结论 介绍 MySQL 触发器是一种数据库对象,可以在特定的数据库表上自动执行一系列的操作,例如插入、更新或删除数据,当特定的事件(例如数据的插入、更新或…

ES6面试题——var,let,const的区别

它们都是用来声明变量的。 1. var具有变量提升机制&#xff0c;let和const没有 /* var有变量提升机制 */ <script> console.log(str); // 打印出undefined var str "你好"; </script>/* let没有变量提升机制 */ <script> console.log(str); // …

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

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

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

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

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

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

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

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

共模和差模的基本概念

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

51单片机第18步_将TIM0用作13位定时器

本章重点学习将TIM0用作13位定时器。 #include <REG51.h> //包含头文件REG51.h,使能51内部寄存器; //定时器的方式控制寄存器TMOD: GATE1,C/T1,M1_1,M1_0,GATE0,C/T0,M0_1,M0_0 //GATE11,表示T1是受INT1脚(P3.3)控制运行; //C/T10,表示T1的时钟源为fosc/12;C/T11,表示…

c++类成员指针用法

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

Meven

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

微信小程序调用函数

在微信小程序中调用函数是一个基础且重要的概念&#xff0c;它贯穿于小程序开发的各个方面。函数可以定义在Page对象中&#xff0c;也可以定义在独立的JS文件中并通过模块导入使用。下面我将详细介绍几种常见的函数调用场景和方法。 1. 在Page对象中定义和调用函数 在小程序的…

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

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

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

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

微信小程序实现轻提示

微信小程序提供了多种内置的方法来显示提示信息&#xff0c;包括但不限于wx.showToast、wx.showModal和wx.showLoading等。这些方法可以快速地在小程序中实现各种提示效果&#xff0c;而无需手动编写复杂的动画或样式代码。下面&#xff0c;我将详细介绍这几个方法的使用。 1.…

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

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

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

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

RESTful Web 服务详解

RESTful Web 服务是一种基于 Representational State Transfer (REST) 架构风格的 Web 服务&#xff0c;它利用 HTTP 协议来传输数据&#xff0c;支持多种数据格式如 JSON 和 XML。在 Spring 框架中&#xff0c;通过简单配置和注解可以轻松实现 RESTful Web 服务。在本文中&…