实时3d视图pov-ray和tkinter

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实时3d视图pov-ray和tkinter相关的知识,希望对你有一定的参考价值。

我正在尝试在python(tkinter)中制作GUI。我已经成功创建了该应用程序,这样我就可以通过POV-ray渲染场景。我按下按钮“向左移动”,这将更改相机在.pov文件中的位置,重新渲染场景并将其显示在GUI中(与旋转和放大/缩小相同)。

但是我想进行互动。即使用鼠标完全像matplotlib 3D图形一样与场景进行交互,但用于光线渲染。

如何解决这个问题?

场景的位置值为

Img_1位置<0,0,-10>

Img_2位置<0,-10,-10>

Img_3位置<25,0,-10>

PS

我不试图在我的GUI中导入matplotlib图。只为分享我想通过渲染场景实现的目标。

[<< src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9BTmo1SS5wbmcifQ==” alt =“ img1”>] img1 1

[<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS90N0hqYi5wbmcifQ==” alt =“ img2”>] img2 2

[<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS8zSm5Oai5wbmcifQ==” alt =“ img3”>] img3 3

答案

您可以使用鼠标事件<Motion><Button-1>(及其他)运行将更改窗口内容的功能。


EDIT:示例显示了使用鼠标时如何使用bind()运行功能以及如何计算diff_xdiff_y移动对象。您必须在bind()中使用自己的功能,该功能将使用diff_xdiff_y移动POVRay相机并渲染新图像。然后,您将不得不替换画布上的图像。但是我将使用画布对象而不是POVRay来显示如何在鼠标移动时改变它。


此示例在移动鼠标时移动矩形,并且在单击按钮时会更改颜色。但是您可以运行用于移动,缩放或旋转渲染图像的功能。

import tkinter as tk

# --- functions ---

def move_item(event):
    canvas.coords(item, event.x-50, event.y-50, event.x+50, event.y+50)

def change_item(event):
    if canvas.itemcget(item, 'fill') == 'red':
        canvas.itemconfig(item, fill='blue')
    else:        
        canvas.itemconfig(item, fill='red')

# --- main ---

root = tk.Tk()

canvas = tk.Canvas(root, width=500, height=300)
canvas.pack()

item = canvas.create_rectangle(0, 0, 100, 100, fill='red')

canvas.bind("<Button-1>", change_item)
canvas.bind("<Motion>", move_item)

root.mainloop()

EDIT:使用<B1-Motion><Shift-B1-Motion><Control-B1-Motion>移动对象的示例:

  • 全方位(left mouse button),
  • 仅水平(Shift + left mouse button
  • 仅垂直(Control + left mouse button)。

代码:

import tkinter as tk

# --- functions ---

def move_item(event):
    global old_x
    global old_y    
    diff_x = event.x - old_x
    diff_y = event.y - old_y
    for item in items:
        canvas.move(item, diff_x, diff_y)
    old_x = event.x
    old_y = event.y

def move_horizontal(event):
    global old_x
    diff_x = event.x - old_x
    for item in items:
        canvas.move(item, diff_x, 0)
    old_x = event.x

def move_vertical(event):
    global old_y
    diff_y = event.y - old_y
    for item in items:
        canvas.move(item, 0, diff_y)
    old_y = event.y

def save_position(event):
    global old_x
    global old_y    
    old_x = event.x
    old_y = event.y

# --- main ---

old_x = 0
old_y = 0
# init
root = tk.Tk()

# create canvas
canvas = tk.Canvas(root, width=500, height=300)
canvas.pack()

# create objects
items = [
    canvas.create_rectangle(100, 100, 130, 130, fill='red'),
    canvas.create_rectangle(200, 100, 230, 130, fill='blue'),
    canvas.create_rectangle(100, 200, 130, 230, fill='yellow'),
]

canvas.bind("<Button-1>", save_position)
canvas.bind("<B1-Motion>", move_item)
canvas.bind("<Shift-B1-Motion>", move_horizontal)
canvas.bind("<Control-B1-Motion>", move_vertical)
# start program
root.mainloop()

以上是关于实时3d视图pov-ray和tkinter的主要内容,如果未能解决你的问题,请参考以下文章

论文解读AVOD-Net 用于自动驾驶的聚合视图3D对象检测网络

论文解读AVOD-Net 用于自动驾驶的聚合视图3D对象检测网络

100个 Unity实用技能 | Scene视图选择对象是否边缘高亮显示网格线

Bmap 使用帮助

英伟达实时 3D 设计协作和仿真平台已正式发布

未来可以基于3D打印扫描和互联网实现实时隔空投物