Enhancement: Initialize SE3 matrix with look_at() function
@petercorke já está trabalhando nisso.
Desde 31/1/2022.
Avaliação
Esta issue ainda não foi avaliada.
Descrição
Feature description
I was wondering if it would make sense to add a look_at() function for this library for initializing an SE3 transformation matrix. I personally use this when positioning a camera etc. where I want the camera at an exact position, look at a specific point, and define which axis is up. This makes defining the pose of the camera very easy. I use an implementation of this function in mitsuba2, where the parameters are
- origin: defines the translation part of the matrix
- target: the target point the z-axis should point towards
- up: the direction which is perpendicular with the x-axis of the transform and the direction of the vector from the origin to the target
Examples
Below are a couple of examples of how the function works in Mitsuba2
Example 1
T = look_at(origin=[1,2,3], target=[0,0,0], up=[0,0,1])
print(T)
[[0.894427, -0.358569, -0.267261, 1],
[-0.447214, -0.717137, -0.534522, 2],
[0, 0.597614, -0.801784, 3],
[0, 0, 0, 1]]
Example 2
T = look_at(origin=[0,0,0], target=[3,0,0], up=[0,1,0])
print(T)
[[0, -0, 1, 0],
[0, 1, 0, 0],
[-1, 0, 0, 0],
[0, 0, 0, 1]]
Mitsuba C++ implementation
static Transform look_at(const Point<Float, 3> &origin,
const Point<Float, 3> &target,
const Vector<Float, 3> &up) {
using Vector3 = Vector<Float, 3>;
Vector3 dir = normalize(target - origin);
dir = normalize(dir);
Vector3 left = normalize(cross(up, dir));
Vector3 new_up = cross(dir, left);
Matrix result = Matrix::from_cols(
concat(left, Scalar(0)),
concat(new_up, Scalar(0)),
concat(dir, Scalar(0)),
concat(origin, Scalar(1))
);
Matrix inverse = Matrix::from_rows(
concat(left, Scalar(0)),
concat(new_up, Scalar(0)),
concat(dir, Scalar(0)),
Vector<Float, 4>(0.f, 0.f, 0.f, 1.f)
);
inverse[3] = inverse * concat(-origin, Scalar(1));
return Transform(result, transpose(inverse));
}
Generalization
The Mitsuba implementation only works for pointing the z-axis at a specific direction defined by the direction of the vector between the origin and the target. The up-axis is also predefined to specify a specific axis in the resulting transformation matrix. For generalization of the function, it could make sense to specify which axes should point toward to target, and which axis is up. This will however complicate the function further. One could split the functionality into three functions for example:
SE3.x_look_at(origin, target, up)
SE3.y_look_at(origin, target, up)
SE3.z_look_at(origin, target, up)
Does this makes sense for anyone else, or would it bloat the code and documentation?
- Linguagem predominante
- Python
- Estrelas
- 641
- Forks
- 102
- Merge médio
- 1d 18h
- PRs com merge (30d)
- 4
Guia de contribuição
Nenhum guia de contribuição indexado para este repositório
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de rai-opensource/spatialmath-python
-
enhancement
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
rai-opensource/spatialmath-python#32 · 4 comentários ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 50/100
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 42/100
-
bug
rai-opensource/spatialmath-python#165 · 2 comentários · 1 responsável ·
-
Type-check spatialmath Aberta
rai-opensource/spatialmath-python#143 · 8 comentários · 1 responsável ·
Todas as issues de rai-opensource/spatialmath-python
Issues semelhantes
-
link-check link-check:sphinx-theme
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
qgis/QGIS-Documentation#11275 ·
-
bug priority:normal ready-for-dev
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
OpenHands/extensions#626 · 1 comentário ·
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 90/100
CSCfi/sd-search-api#39 ·
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 90/100