Correctly apply frame transform to light direction.

PiperOrigin-RevId: 665340267
Change-Id: Ida16ddbf3a057ffd3e260b71180a45acbf749931
This commit is contained in:
Yuval Tassa
2024-08-20 06:47:17 -07:00
committed by Copybara-Service
parent 2425358c3b
commit ad9cd7301e
2 changed files with 34 additions and 4 deletions
+6 -3
View File
@@ -3222,11 +3222,14 @@ void mjCLight::CopyFromSpec() {
void mjCLight::Compile(void) {
CopyFromSpec();
double quat[4]= {1, 0, 0, 0};
// frame
if (frame) {
mjuu_frameaccumChild(frame->pos, frame->quat, pos, quat);
// apply frame transform to pos, qunit is unused
double qunit[4]= {1, 0, 0, 0};
mjuu_frameaccumChild(frame->pos, frame->quat, pos, qunit);
// rotate dir
mjuu_rotVecQuat(dir, dir, frame->quat);
}
// normalize direction, make sure it is not zero
+28 -1
View File
@@ -2086,7 +2086,6 @@ TEST_F(MujocoTest, Frame) {
</body>
</worldbody>
</mujoco>
)";
constexpr mjtNum eps = 1e-14;
std::array<char, 1024> error;
@@ -2142,6 +2141,34 @@ TEST_F(MujocoTest, Frame) {
mj_deleteData(d);
}
TEST_F(MujocoTest, FrameTransformsLight) {
static constexpr char xml[] = R"(
<mujoco>
<worldbody>
<frame euler="0 45 0" pos="0 0 1">
<light pos="-1 0 0" dir="1 0 -1"/>
</frame>
</worldbody>
</mujoco>
)";
std::array<char, 1024> error;
mjModel* m = LoadModelFromString(xml, error.data(), error.size());
EXPECT_THAT(m, testing::NotNull()) << error.data();
EXPECT_EQ(m->nlight, 1);
constexpr mjtNum eps = 1e-14;
EXPECT_NEAR(m->light_pos[0], -mju_sqrt(.5), eps);
EXPECT_NEAR(m->light_pos[1], 0, eps);
EXPECT_NEAR(m->light_pos[2], 1 + mju_sqrt(.5), eps);
EXPECT_NEAR(m->light_dir[0], 0, eps);
EXPECT_NEAR(m->light_dir[1], 0, eps);
EXPECT_NEAR(m->light_dir[2], -1, eps);
mj_deleteModel(m);
}
// ------------- test bvh ------------------------------------------------------
TEST_F(MujocoTest, RobustBVH) {
static constexpr char xml1[] = R"(