无循环实现立方体X/Y轴旋转:矩阵与张量逐行相乘方法
无循环实现立方体双旋转后的边坐标计算
需求概述
不使用循环,计算立方体经过X轴、Y轴两次旋转后的边顶点坐标,原始数据定义如下:
立方体顶点数据
import numpy as np cube_vertices = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0], [0, 0, 1], [1, 0, 1], [0, 1, 1], [1, 1, 1]])
立方体边数据
cube_edges = np.array([[cube_vertices[0], cube_vertices[1]], [cube_vertices[0], cube_vertices[3]], [cube_vertices[1], cube_vertices[2]], [cube_vertices[3], cube_vertices[2]], [cube_vertices[1], cube_vertices[5]], [cube_vertices[2], cube_vertices[7]], [cube_vertices[3], cube_vertices[6]], [cube_vertices[0], cube_vertices[4]], [cube_vertices[4], cube_vertices[5]], [cube_vertices[4], cube_vertices[6]], [cube_vertices[6], cube_vertices[7]], [cube_vertices[5], cube_vertices[7]]])
错误点修正
你之前的实现存在两个关键问题:
- 旋转矩阵计算错误:使用
Rx * Ry是元素级乘法,而非矩阵乘法,无法得到正确的复合旋转效果。 - 冗余的矩阵复制:无需将旋转矩阵tile为
(12,2,3,3),numpy的广播机制可自动适配批量运算。
正确实现方案
步骤1:计算复合旋转矩阵
先定义X轴、Y轴的旋转矩阵,再通过矩阵乘法得到复合旋转矩阵(旋转顺序:先绕X轴旋转theta,再绕Y轴旋转phi,若需调整顺序,交换矩阵乘法顺序即可):
phi, theta = 0.1, 0.1 # X轴旋转矩阵 Rx = np.array([[1, 0, 0], [0, np.cos(theta), -np.sin(theta)], [0, np.sin(theta), np.cos(theta)]]) # Y轴旋转矩阵 Ry = np.array([[np.cos(phi), 0, np.sin(phi)], [0, 1, 0], [-np.sin(phi), 0, np.cos(phi)]]) # 复合旋转矩阵(先X转,再Y转) R = Ry @ Rx
步骤2:批量旋转边顶点
利用numpy广播特性,直接对cube_edges做批量矩阵乘法,无需循环,输出形状为(12,2,3)的旋转后边坐标:
rotated_edges = np.matmul(cube_edges, R) # 或更简洁的写法:rotated_edges = cube_edges @ R
验证结果
rotated_edges的每个元素对应原边顶点旋转后的坐标,例如原第一条边[0,0,0]和[1,0,0]旋转后的结果可通过以下查看:
print(rotated_edges[0])
内容的提问来源于stack exchange,提问作者Serge Konstantinov
相关产品推荐
相关产品推荐

