2012-01-27 22 views
6

Tôi đang cố gắng tìm hiểu xem có cách nào thay đổi góc nhìn trong máy xay bằng cách sử dụng Python hay không. Tôi muốn một kết quả như bạn sẽ nhận được từ cách nhấn 1, 3 hoặc 7 trên num. tập giấy.Thay đổi góc nhìn trong máy xay bằng cách sử dụng Python

Cảm ơn bạn đã giúp đỡ bất kỳ

+0

Phiên bản nào của Máy xay sinh tố? – Blender

+0

Còn về ['bpy.ops.view3d.viewnumpad'] (http://www.blender.org/documentation/blender_python_api_2_69_0/bpy.ops.view3d.html?highlight=numpad#bpy.ops.view3d.viewnumpad)? – gandalf3

+0

xem thêm http://blender.stackexchange.com/a/678/2762 –

Trả lời

6

Trước hết, lưu ý rằng bạn có thể có nhiều quan điểm 3D mở cùng một lúc, và mỗi thanh lại có góc khung nhìn riêng, quan điểm/ortho thiết lập của nó vv Vì vậy, kịch bản của bạn sẽ phải tìm kiếm tất cả các chế độ xem 3D có thể hiện diện (có thể không có) và quyết định cái nào sẽ ảnh hưởng đến.

Bắt đầu với đối tượng bpy.data, có thuộc tính window_managers. Bộ sưu tập này dường như luôn có một phần tử. Tuy nhiên, có thể có một hoặc nhiều mở windows. Mỗi cửa sổ có screen, được chia thành một hoặc nhiều areas. Vì vậy, bạn cần phải tìm kiếm thông qua tất cả các lĩnh vực cho một với một không gian type của "VIEW_3D". Và sau đó săn qua các spaces của khu vực này cho một (s) với loại "VIEW_3D". Khoảng trống như vậy sẽ là của phân lớp SpaceView3D. Điều này sẽ có thuộc tính region_3d thuộc loại RegionView3D. Và cuối cùng, đối tượng này lần lượt có một thuộc tính được gọi là view_matrix, có giá trị loại Matrix mà bạn có thể nhận hoặc đặt.

Có tất cả những điều đó? :)

4

Khi bạn đã đặt quyền 'view', bạn có thể sửa đổi:

view.spaces[0].region_3d.view_matrix 
view.spaces[0].region_3d.view_rotation 

Lưu ý rằng region_3d.view_location là mục tiêu 'look_at', không phải là vị trí của máy ảnh; bạn phải sửa đổi view_matrix trực tiếp nếu bạn muốn di chuyển vị trí của máy ảnh (theo như tôi biết), nhưng bạn có thể tinh chỉnh điều chỉnh xoay bằng cách sử dụng view_rotation khá dễ dàng. Có thể bạn sẽ cần phải đọc này để tạo ra một quaternion hợp lệ mặc dù: http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation

Có lẽ một cái gì đó như thế này có thể hữu ích:

class Utils(object): 

    def __init__(self, context): 
    self.context = context 

    @property 
    def views(self): 
    """ Returns the set of 3D views. 
    """ 
    rtn = [] 
    for a in self.context.window.screen.areas: 
     if a.type == 'VIEW_3D': 
     rtn.append(a) 
    return rtn 

    def camera(self, view): 
    """ Return position, rotation data about a given view for the first space attached to it """ 
    look_at = view.spaces[0].region_3d.view_location 
    matrix = view.spaces[0].region_3d.view_matrix 
    camera_pos = self.camera_position(matrix) 
    rotation = view.spaces[0].region_3d.view_rotation 
    return look_at, camera_pos, rotation 

    def camera_position(self, matrix): 
    """ From 4x4 matrix, calculate camera location """ 
    t = (matrix[0][3], matrix[1][3], matrix[2][3]) 
    r = (
     (matrix[0][0], matrix[0][1], matrix[0][2]), 
     (matrix[1][0], matrix[1][1], matrix[1][2]), 
     (matrix[2][0], matrix[2][1], matrix[2][2]) 
    ) 
    rp = (
     (-r[0][0], -r[1][0], -r[2][0]), 
     (-r[0][1], -r[1][1], -r[2][1]), 
     (-r[0][2], -r[1][2], -r[2][2]) 
    ) 
    output = (
     rp[0][0] * t[0] + rp[0][1] * t[1] + rp[0][2] * t[2], 
     rp[1][0] * t[0] + rp[1][1] * t[1] + rp[1][2] * t[2], 
     rp[2][0] * t[0] + rp[2][1] * t[1] + rp[2][2] * t[2], 
    ) 
    return output 
Các vấn đề liên quan