跳转至

§7.2 3D 文本#

约 287 个字 46 行代码 预计阅读时间 5 分钟

一、标记文本#

标记文本并不算是真正的 3D 的文本,它只是在画布上某一位置进行标记,其大小并不会随着标记点位置的改变而改变。

标记文本,顾名思义,只是为了标记而已。实际上,上一章开头的那张图中的文本就是标记文本。

标记文本是类 tools_3d.Point 的一个参数,下面会进行简单的演示:

png

上图就是很简单地给一个正方体的 8 个顶点标记了字母。看到这里,或许你可以思考一下,如何实现上一章开头的那张图的效果。

源代码
import tkintertools as tkt
from tkintertools import tools_3d as t3d

root = tkt.Tk('Markup Text', 1280, 720)
space = t3d.Space(root, 1280, 720, 0, 0, bg='black', keep=False)

t3d.Cuboid(space, -100, -100, -100, 200, 200, 200,
           color_outline_back='white', color_outline_down='white', color_outline_front='white',
           color_outline_left='white', color_outline_right='white', color_outline_up='white')

t3d.Point(space, (-100, -100, -100), size=0, markuptext='A', markupfill='red', markupdelta=(0, 20))
t3d.Point(space, (100, -100, -100), size=0, markuptext='B', markupfill='orange', markupdelta=(0, 20))
t3d.Point(space, (-100, 100, -100), size=0, markuptext='C', markupfill='yellow', markupdelta=(0, 20))
t3d.Point(space, (-100, -100, 100), size=0, markuptext='D', markupfill='green', markupdelta=(0, 20))
t3d.Point(space, (-100, 100, 100), size=0, markuptext='E', markupfill='cyan', markupdelta=(0, 20))
t3d.Point(space, (100, -100, 100), size=0, markuptext='F', markupfill='blue', markupdelta=(0, 20))
t3d.Point(space, (100, 100, -100), size=0, markuptext='G', markupfill='purple', markupdelta=(0, 20))
t3d.Point(space, (100, 100, 100), size=0, markuptext='H', markupfill='white', markupdelta=(0, 20))

space.space_sort()
root.mainloop()

二、3D 文本#

tools_3d 中,真正的 3D 文本实际指的是 tools_3d.Text3D 对象。它不同于标记文本,它的字体大小会随着空间位置的变化而变化。

下面是一个简单的示例:

png

上面的图是一个由 3D 文本组成的球,每个文本的字体大小是一样的,但由于空间上的前后关系,在后面的文本会小一些。

源代码
import math
import random

import tkintertools as tkt
from tkintertools import tools_3d as t3d

root = tkt.Tk('Text3D', 1280, 720)
space = t3d.Space(root, 1280, 720, 0, 0, bg='black', keep=False)

r = 300  # 3D 文本球半径

for _ in range(300):
    x = random.randint(-r, r)
    y = random.randint(-r, r)
    z = random.randint(-r, r)
    if k := math.hypot(x, y, z) / r:  # 防止除数为零
        x /= k
        y /= k
        z /= k
        t = chr(random.randint(65, 90))
        c = f'#{random.randint(1, 256 ** 3 - 1):06X}'
        t3d.Text3D(space, map(round, (x, y, z)), text=t, fill=c)

space.space_sort()
root.mainloop()

欢迎在评论区留下你的想法


下面没有更多评论啦😆