Enhancement: Initialize SE3 matrix with look_at() function
@petercorke is already working on this.
Since Jan 31, 2022.
Assessment
This issue has not been assessed yet.
Description
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?
- Dominant language
- Python
- Stars
- 641
- Forks
- 102
- Avg merge
- 1d 18h
- Merged PRs (30d)
- 4
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from rai-opensource/spatialmath-python
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
rai-opensource/spatialmath-python#32 · 4 comments ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 50/100
-
Difficulty 3/5 1-2 days Newbie friendliness 42/100
-
bug
rai-opensource/spatialmath-python#165 · 2 comments · 1 assignee ·
-
rai-opensource/spatialmath-python#143 · 8 comments · 1 assignee ·
All issues in rai-opensource/spatialmath-python
Similar issues
-
area/auth bug comp/agent P3 platform/discord type/security
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
NousResearch/hermes-agent#117848 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
bancolombia/sentinel#23 ·
-
test md OpenCI
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
-
integration:quickjs org:external priority:backlog topic:code-interpreter topic:middleware type:feature
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
langchain-ai/deepagents#6450 ·
-
bug client
Difficulty 2/5 1-3 hours Newbie friendliness 88/100