通过Python脚本实现字符画

news2024/12/23 23:48:48

效果

讲解:

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

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

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

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

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

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

代码:

import bpy
import gpu
import numpy as np
from mathutils import Color


def 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 = False


class TextCharacterDrawing(bpy.types.Operator):
    bl_idname = "view3d.text_character_drawing"
    bl_label = "Draw 3D View Framebuffer"

    def __init__(self):
        print("启动")

        self.width = 32
        self.height = 32
        self.modal_redraw = False
        self.text_name = "Generated Text"
        self.framebuffer = None
        self.viewport_info = None
        self.pixelBuffer = None
        self.default_texts = None
        self.framebuffer_texts = None
        self.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_texts

            print("删除绘图处理程序")
            return {'CANCELLED'}

        else:
            self.modal_redraw = True

        return {'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].text
            area.spaces[0].text = self.framebuffer_texts
            with 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.coloradmin.cn/o/1877896.html

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

相关文章

【软件测试】白盒测试(知识点 + 习题 + 答案)

《 软件测试基础持续更新中》 最近大家总是催更……,我也是百忙之中给大家详细总结了白盒测试的重点内容! 知识点题型答案,让你用最短的时间,学到最高效的知识! 整理不易,求个三连 ₍ᐢ..ᐢ₎ ♡ 目录 一、…

Oracle数据库使用指南基本概念

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…

将深度相机的实时三维坐标数据保存为excel文档

一、如何将数据保存为excel文档 1.excel文件库与相关使用 (1)导入相应的excel文件库,导入前先要进行pip安装,pip install xlwt import xlwt # 导入用于创建和写入Excel文件的库 (2) 建立一个excel文档,并在第0行写…

PyQt问题汇总(持续更新)

目录 1.抛出异常后QAppliaction自动闪退 2.Unbuntu共享文件夹自动挂载 1.抛出异常后QAppliaction自动闪退 开发阶段,PyQt5 QAppliaction会在遇到未捕获的异常时立即退出,它能够快速发现并报告错误,我在调用一些密码算法库的时候&#xff0…

利用SHAP算法解释BERT模型的输出

1 何为SHAP? 传统的 feature importance 只告诉哪个特征重要,但并不清楚该特征如何影响预测结果。SHAP 算法的最大优势是能反应每一个样本中特征的影响力,且可表现出影响的正负性。SHAP算法的主要思想为:控制变量法,如果某个特征…

个人开发实现AI套壳网站快速搭建(Vue+elementUI+SpringBoot)

目录 一、效果展示 二、项目概述 三、手把手快速搭建实现本项目 3.1 前端实现 3.2 后端方向 五、后续开发计划 一、效果展示 默认展示 一般对话展示: 代码对话展示: 二、项目概述 本项目是一个基于Web的智能对话服务平台,通过后端与第…

【图解大数据技术】Hive、HBase

【图解大数据技术】Hive、HBase Hive数据仓库Hive的执行流程Hive架构数据导入Hive HBaseHBase简介HBase架构HBase的列式存储HBase建表流程HBase数据写入流程HBase数据读取流程 Hive Hive是基于Hadoop的一个数据仓库工具,Hive的数据存储在HDFS上,底层基于…

41割队伍

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/387 题目描述 给定 𝑛n 个数字 𝑎1,�…

运维.Linux下执行定时任务(中:Cron的常用替代方案)

运维系列 Linux下执行定时任务(中:Cron的常用替代方案) - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAd…

阿里云智能编程助手的安装使用

https://help.aliyun.com/document_detail/2590613.html 通义灵码,是阿里云出品的一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力&a…

前端存储都有哪些

cookie 、sessionStorage、localStorange、http缓存 、indexDB cookie 由服务器设置,在客户端存储,然后每次发起同源请求时,发送给服务器端。cookie最多能存储4K数据,它的生存时间由expires属性指定,并且cookie只能被…

Mathematica训练课(46)-- 一些常用的画图函数

在前面的课程中,我们已经梳理了Plot的画图用法,今天就详细梳理一下其他的画图函数用法; 1. 画一条直线 2. Circle(圆) 3. Disk(圆盘) 4. 画出一个矩形 5. 箭头

MAS0902量产工具分享,MAS0902A开卡教程,MAS0901量产工具下载

MAS0902和MAS1102都是基于SATA3.2技术开发的DRAM-less SSD控制芯片,简单来说就是SATA协议无缓存主控。下面是我摸索的麦光黑金300 240G SSD开卡修复简易教程,也就是MAS0902量产过程: 注意:开卡转接线必须要用ASM1153E或JMS578主控…

Github Page 使用手册(保姆级教程!)

搭建个人网站?没有服务器?那不如尝试一下 Github Page ! 最近我正好在搭建个人网站,于是就写一篇博客来详细介绍 Github Page 的使用、部署方式吧! 一、进入 Github 访问:github.com 如果你没有 github…

Redisson(分布式锁、限流)

注意Redisson是基于Redis的&#xff0c;所以必须先引入Redis配置&#xff08;参考SpringBoot集成Redis文章&#xff09; 1. 集成Redisson 引入依赖 <!-- 二选一,区别是第一个自动配置&#xff0c;第二个还需要手动配置也就是第二步自定义配置&#xff0c;注意版本号&…

【吊打面试官系列-MyBatis面试题】MyBatis 框架适用场合?

大家好&#xff0c;我是锋哥。今天分享关于 【MyBatis 框架适用场合 &#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MyBatis 框架适用场合&#xff1f; 1、MyBatis 专注于 SQL 本身&#xff0c;是一个足够灵活的 DAO 层解决方案。 2、对性能的要求很高&#…

苹果电脑移动硬盘不能写入怎么办 读取移动硬盘的磁盘管理软件 Paragon NTFS for Mac永久激活

对于使用苹果电脑的用户们&#xff0c;我们经常会使用到移动硬盘来拷贝大量的文件。一般的移动硬盘的容量都比较大&#xff0c;再加上国内大多数人使用的都是 Windows 系统&#xff0c;为了通用与方便&#xff0c;所以硬盘的分区一般都是 NTFS 格式的。对于 Windows 系统的 NTF…

LLDP 基本原理

LLDP 简介 定义 LLDP&#xff08;Link Layer Discovery Protocol&#xff0c;链路层发现协议&#xff09;是 IEEE 802.1ab 中定义的第二层发现&#xff08;Layer 2 Discovery&#xff09;协议。 LLDP 提供了一种标准的链路层发现方式&#xff0c;可以将本端设备的主要能力、…

西安高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

随着工业4.0时代的到来&#xff0c;智能制造成为推动制造业转型升级的关键。为了培养学生的创新能力和实践能力&#xff0c;西安高校大学决定建设智能制造实验室&#xff0c;并引入数字孪生技术&#xff0c;构建可视化系统平台。项目旨在通过数字孪生技术&#xff0c;实现对制造…

【吴恩达深度学习笔记系列】Logistic Regression 【理论】

Binary Classification: Logistic Regression: y ^ σ ( w T x b ) \hat{y}\sigma{(w^T xb)} y^​σ(wTxb) using sigmoid function σ 1 1 e − z \sigma \frac{1}{1e^{-z}} σ1e−z1​. 【torch.sigmoid(x)】 Sigmoid ( x ) 1 1 e − x \text{Sigmoid}(x)\frac{1}{…