Correctly apply frame transform to light direction.
PiperOrigin-RevId: 665340267 Change-Id: Ida16ddbf3a057ffd3e260b71180a45acbf749931
This commit is contained in:
committed by
Copybara-Service
parent
2425358c3b
commit
ad9cd7301e
@@ -3222,11 +3222,14 @@ void mjCLight::CopyFromSpec() {
|
|||||||
void mjCLight::Compile(void) {
|
void mjCLight::Compile(void) {
|
||||||
CopyFromSpec();
|
CopyFromSpec();
|
||||||
|
|
||||||
double quat[4]= {1, 0, 0, 0};
|
|
||||||
|
|
||||||
// frame
|
// frame
|
||||||
if (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
|
// normalize direction, make sure it is not zero
|
||||||
|
|||||||
@@ -2086,7 +2086,6 @@ TEST_F(MujocoTest, Frame) {
|
|||||||
</body>
|
</body>
|
||||||
</worldbody>
|
</worldbody>
|
||||||
</mujoco>
|
</mujoco>
|
||||||
|
|
||||||
)";
|
)";
|
||||||
constexpr mjtNum eps = 1e-14;
|
constexpr mjtNum eps = 1e-14;
|
||||||
std::array<char, 1024> error;
|
std::array<char, 1024> error;
|
||||||
@@ -2142,6 +2141,34 @@ TEST_F(MujocoTest, Frame) {
|
|||||||
mj_deleteData(d);
|
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 bvh ------------------------------------------------------
|
||||||
TEST_F(MujocoTest, RobustBVH) {
|
TEST_F(MujocoTest, RobustBVH) {
|
||||||
static constexpr char xml1[] = R"(
|
static constexpr char xml1[] = R"(
|
||||||
|
|||||||
Reference in New Issue
Block a user