Перевод координат

Автор Skorb, 14.03.16, 12:58:17

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Skorb

Здравствуйте, у меня есть сборка, состоящая из 10 деталей, в ней у каждой детали своя ЛСК детали, как мне перевести координаты деталей в ЛСК сборки или в глобальную СК?

Akew

Я решал подобную задачу таким путем:

"Перевести координаты деталей в ЛСК сборки (или в АСК)" означает перевод дочерней СК в материнскую СК, определить преобразование координат точки, заданной в ЛСК, в систему координат материнской СК (АСК).

Дочерняя СК (т.е., ЛСК) относительно материнской (т.е., АСК, если уровень вложенности равен 1) характеризуется центром начала координат, выраженной в АСК, и направлений ее координатных осей, также выраженных в АСК.
Направления координатных осей задаются направляющими косинусами, по три на каждую ось (это косинусы углов между осями АСК и каждой из трех осей ЛСК).

Если ЛСК имеет центр C0( X0лск; Y0лск; Z0лск ) и матрицу направляющих косинусов Aлск
| AXx AYx AZx |
| AXy AYy AZy |
| AXz AYz AZz |,
где
AXx - косинус угла между материнской осью 0X и дочерней осью 0X
AYx - косинус угла между материнской осью 0Y и дочерней осью 0X
AZx - косинус угла между материнской осью 0Z и дочерней осью 0X
и т.д.,
то координаты точки, заданной в ЛСК ( Xлск; Yлск; Zлск ), в материнской СК (Xмск; Yмск; Zмск ) будут следующими:
Xмск = X0лск - (Xлск*AXx) + Y0лск - (Yлск*AXy) + Z0лск - (Zлск*AXz),
Yмск = X0лск - (Xлск*AYx) + Y0лск - (Yлск*AYy) + Z0лск - (Zлск*AYz),
Zмск = X0лск - (Xлск*AZx) + Y0лск - (Yлск*AZy) + Z0лск - (Zлск*AZz).

ЛСК могут иметь любой уровень вложенности относительно АСК, и для перехода в АСК необходимо провести аналогичное последовательное преобразование от дочерних СК к материнским, пока не дойдем до АСК.

Это теория. Теперь практика.

1. Получаем IPart7 корневого компонента.
2. Получаем IPlacement3DPtr.
3. Получаем точку вставки компоненты: part7->GetOrigin( &x, &y, &z ).
4. Получаем матрицу преобразования, состоящую из из 16 элементов: _variant_t matrixLCS = part7->GetMatrix3D(),
   у которой элементы с 1 по 3 - направляющие косинусы, соответствующие AXx, AYx, AZx в приведенной выше матрице,
   элементы с 5 по 7 - направляющие косинусы, соответствующие AXy, AYy, AZy,
   элементы с 9 по 11 - направляющие косинусы, соответствующие AXz, AYz AZz.
   (В принципе, точка вставки находится где-то среди этих не использованных 16 элементов, но ее проще взять так, как показано в п.3.)
5. Шаги 1-4 повторяем для всех вложенных компонент, приведенных к IPart7.
6. Найдя нужную компоненту, применяем к ней цепочку преобразований координат.

Повозиться придется, - потребуется терпение.
+ Благодарностей: 2

Vitalij Lysanov


Координаты точек осей задаются относительно центра ЛСК

Если запрашивать координаты точек X  Y  Z осей на детали, вставленные в сборку без поворотов:
iplac.GetAxis(x, y, z,0)
iplac.GetAxis(x, y, z,1)
iplac.GetAxis(x, y, z,2)

Получим
1 0 0   
0 1 0   
0 0 1   

Если вращать в одной плоскости  XY,
1 и 0  нужно заменить на косинус и синус угла,
0 и  1 соответственно на синус и косинус.
При записи координат get нужно заменить на set.

cos    sin    0
-sin     cos    0
0        0       1

Можно задавать только две оси, третья вычисляется сама.
Между осями  должно быть 90 градусов, иначе Компас может отказаться рисовать.
Если между осями не будет 90 градусов, некоторые системы могут это принять и исказить изображение ( перспектива и др).   

При повороте в двух плоскостях, результирующую матрицу можно получить произведением матриц поворотов по осям.


Msum=np.dot(T,T)

Пример поворота на углы 0.3 и 0.7

import numpy as np
from vtk_visualizer import *
vtkControl = VTKVisualizerControl()
import math


vtkControl.AddSTLActor("D:\Bolt.STL")



# Get ID of last actor added
nID = vtkControl.GetLastActorID()

# 4x4 matrix for translation of origin to position [5,10,0]
T = np.eye(4)
T2 = np.eye(4)

ug=0.3
ug2=0.7

T[0,0] =math.cos(ug)
T[1,1] =math.cos(ug)
T[0,1] =math.sin(ug)
T[1,0] =-math.sin(ug)

T2[0,0] =math.cos(ug2)
T2[2,2] =math.cos(ug2)
T2[0,2] =math.sin(ug2)
T2[2,0] =-math.sin(ug2)





M=np.dot(T,T2)
print"T"
print T
print
print"T2"
print T2
print
print"M"
print M


# Apply transformation
vtkControl.SetActorTransform(nID, M)








T
[[ 0.95533649  0.29552021  0.          0.        ]
[-0.29552021  0.95533649  0.          0.        ]
[ 0.          0.          1.          0.        ]
[ 0.          0.          0.          1.        ]]

T2
[[ 0.76484219  0.          0.64421769  0.        ]
[ 0.          1.          0.          0.        ]
[-0.64421769  0.          0.76484219  0.        ]
[ 0.          0.          0.          1.        ]]

M
[[ 0.73068165  0.29552021  0.61544466  0.        ]
[-0.22602632  0.95533649 -0.19037934  0.        ]
[-0.64421769  0.          0.76484219  0.        ]
[ 0.          0.          0.          1.        ]]

http://www.edge.no/wiki/Python_VTK
+ Благодарностей: 2

Ё

 Блин... Такая умная молодЁжь, а старики мучаются с "кульбитами" модели при эскизировании в "3D"... Разве трудно предложить пользователю назначать удобную ему ориентацию СК и сторону плоскости эскизирования? Насколько там модель станет "толще"? Мизер...

Akew

Цитироватьу меня есть сборка, состоящая из 10 деталей, в ней у каждой детали своя ЛСК детали, как мне перевести координаты деталей в ЛСК сборки или в глобальную СК?
См. ksPart::TransformPoint и ksPart::TransformPoints.