Python в блендере – как вращаться вокруг оси, которая не проходит через начало координат?Python

Программы на Python
Ответить
Anonymous
 Python в блендере – как вращаться вокруг оси, которая не проходит через начало координат?

Сообщение Anonymous »

Привет, я новичок в программировании. я хотел вращаться вокруг линии, которая не проходит через начало координат объекта, созданного в блендере.
(Я нахожусь в разделе сценариев блендера).
Мне нужна помощь, поскольку подход, который я использую, неверен и не работает
Поэтому сначала я сделал так:

Код: Выделить всё

import bpy
bpy.ops.mesh.primitive_cube_add(location=(0, 0, 0))
from mathutils import Matrix, Vector
import math
import numpy as np

# Create a 4x4 identity matrix
identity_matrix = Matrix.Identity(4)
print(identity_matrix)

angle = math.radians(45)
rotation_matrix = Matrix((
(math.cos(angle), -math.sin(angle), 0.0, 1.0 - math.cos(angle)+ math.sin(angle)),
(math.sin(angle), math.cos(angle), 0.0, 1.0 - math.cos(angle)- math.sin(angle)),
(0.0, 0.0, 1.0, 0.0),
(0.0, 0.0, 0.0, 1.0)
))

# Define the translation vector (distance from the origin)
translation_vector = Vector((1, 1, 1))

# Create translation matrices
#numpy_matrix = np.array(rotation_matrix)
#exponent = 1
#result_matrix = np.linalg.matrix_power(numpy_matrix, exponent)
#result_blender_matrix = Matrix(result_matrix)

#decompose matrix
initial_loc, initial_rot, initial_scale = identity_matrix.decompose()
final_loc, final_rot, final_scale = rotation_matrix.decompose()

# Assign the matrix to an object's transformation
obj = bpy.context.active_object

#keyframe initial transformation
obj.location = initial_loc
obj.rotation_euler = initial_rot.to_euler()
obj.scale = initial_scale

obj.keyframe_insert(data_path="location", frame=1)
obj.keyframe_insert(data_path="rotation_euler", frame=1)
obj.keyframe_insert(data_path="scale", frame=1)

#keyframe final transformation

obj.location = final_loc
obj.rotation_euler = final_rot.to_euler()
obj.scale = final_scale

obj.keyframe_insert(data_path="location", frame=50)
obj.keyframe_insert(data_path="rotation_euler", frame=50)
obj.keyframe_insert(data_path="scale", frame=50)

# Access and keyframe the fourth column of the final matrix
translation_final = final_matrix.col[3]
obj.location = (translation_final.x, translation_final.y, translation_final.z)
obj.keyframe_insert(data_path="location", frame=50)

bpy.context.scene.frame_start = 1
bpy.context.scene.frame_end = 50
bpy.context.scene.frame_set(1)
затем я понял, что не могу этого сделать, потому что кадры обновлялись только в конце моего преобразования, поэтому часть матрицы перевода могла быть только вектором.
Поэтому я хотел сделать так, чтобы для каждой степени обновлялись значения, и написал это:

Код: Выделить всё

import bpy
bpy.ops.mesh.primitive_cube_add(location=(0, 0, 0))
from mathutils import Matrix, Vector
import math
import numpy as np

# Create a 4x4 identity matrix
identity_matrix = Matrix.Identity(4)
print(identity_matrix)

obj = bpy.context.active_object

for i in range(360):
angle = math.radians(i)
rotation_matrix = Matrix((
(math.cos(angle), -math.sin(angle), 0.0, 0.0),
(math.sin(angle), math.cos(angle),  0.0, 0.0),
(0.0, 0.0, 1.0, 0.0),
(0.0, 0.0, 0.0, 1.0)
))

transation_matrix = Matrix((
(1.0, 0.0, 0.0, 1.0),
(0.0, 1.0, 0.0, 0.0),
(0.0, 0.0, 1.0, 0.0),
(0.0, 0.0, 0.0, 1.0)
))

transation_back_matrix = Matrix((
(1.0, 0.0, 0.0, -1.0),
(0.0, 1.0, 0.0, 0.0),
(0.0, 0.0, 1.0, 0.0),
(0.0, 0.0, 0.0, 1.0)
))

combined_matrix = transation_back_matrix @ rotation_matrix @ transation_matrix
initial_loc, initial_rot, initial_scale = identity_matrix.decompose()
final_loc, final_rot, final_scale = combined_matrix.decompose()
obj.location = initial_loc
obj.rotation_euler = initial_rot.to_euler()
obj.scale = initial_scale
obj.keyframe_insert(data_path="location", frame=i)
obj.keyframe_insert(data_path="rotation_euler", frame=i)
obj.keyframe_insert(data_path="scale", frame=i)

bpy.context.scene.frame_start = i
bpy.context.scene.frame_end = 360
bpy.context.scene.frame_set(i)

# Additional code outside the loop can be placed here
print("The loop has finished.")
В конце концов, это все равно не работает. Мой куб не движется, даже если бы код работал, он обновлялся бы через определенные промежутки времени. Я хотел использовать матрицы в качестве упражнения, чтобы научиться манипулировать матрицами. Я сформулировал проблему следующим образом: если бы я сделал один шаг вперед, поверните, а затем сделал один шаг назад, я бы вращался вокруг оси передо мной на одну единицу, но в коде я бы сохранил окончательное преобразование, и кадры принесли бы меня от системы отсчета 1 к системе 2 без какого-либо промежуточного шага. Если бы я вращал объект вокруг оси, проблема бы не возникла, потому что кадры двигались (по какой-то причине, я не знаю) плавно. Проблема в том, что я хочу переместить объект вокруг другой оси, например, если я хочу, чтобы он вращался по орбите. Является ли мой подход совершенно неправильным или его можно изменить, чтобы заставить его работать? иначе я не знаю, как решить эту проблему. Спасибо, если вы прочитали это и потрудились ответить мне.

Подробнее здесь: https://stackoverflow.com/questions/793 ... gh-the-ori
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»