首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实时三维视点透视和平移器

实时三维视点透视和平移器
EN

Stack Overflow用户
提问于 2020-01-10 16:33:21
回答 1查看 709关注 0票数 0

我正试图在python (tkinter)中创建一个GUI。我已经成功地创建了这个应用程序,这样我就可以用POV射线渲染一个场景.我按下“向左移动”按钮,这将改变相机在.pov文件中的位置,重新呈现场景并在图形用户界面中显示它(同样用于旋转和放大)。

但我想做的是互动。也就是说,使用鼠标与场景完全交互,就像一个matplotlib 3D图形,但用于光线渲染。

如何着手解决这个问题?

场景的位置值为

Img_1位置<0,0,-10>

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

Img_3位置<25,0,-10>

PS

我并不试图在GUI中导入matplotlib图。这只是供参考,分享我想要实现的与我渲染的场景。

[

[img11]

[

[img22]

[

[img33.]

EN

回答 1

Stack Overflow用户

发布于 2020-01-10 16:46:28

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

编辑:示例演示如何在使用鼠标时使用bind()运行函数,以及如何计算diff_xdiff_y以移动对象。您必须使用自己的函数与bind(),这将使用diff_xdiff_y移动POVRay相机和渲染新的图像。然后你必须替换画布上的图像。但是我将使用画布对象而不是POVRay来展示鼠标移动时它是如何改变的。

此示例在移动鼠标时移动矩形,并在单击按钮时更改颜色。

但是您可以运行移动、缩放或旋转呈现图像的函数。

代码语言:javascript
运行
复制
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()

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

  • 所有方向(left mouse button),
  • 水平方向(Shift + left mouse button)
  • 仅垂直(Control + left mouse button)。

代码:

代码语言:javascript
运行
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59685562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档