本文整理汇总了C++中Pose::Inverse方法的典型用法代码示例。如果您正苦于以下问题:C++ Pose::Inverse方法的具体用法?C++ Pose::Inverse怎么用?C++ Pose::Inverse使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Pose
的用法示例。
在下文中一共展示了Pose::Inverse方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: main
int main(int argc, char *argv[]) try
{
std::cout << "TestDQ\n";
Pose camera = { { 0, 0, 8 }, { 0, 0, 0, 1 } };
bool showaxis = true;
float3 focuspoint(0, 0, 0);
float3 mousevec_prev;
float4 model_orientation(0, 0, 0, 1);
Pose p0 = { { -3, 0, 0 }, { 0, 0, 0, 1 } };
Pose p1 = { { 3, 0, 0 }, { 0, 0, sqrtf(0.5f),sqrtf(0.5f) } };
float dt = 0.01f, t = 0;
Pose *selected = NULL;
std::vector<float4> planes = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { -1, 0, 0, 0 }, { 0, -1, 0, 0 }, { 0, 0, -1, 0 } };
for (auto &p : planes)
p.w = -0.25f;
GLWin glwin("Dual Quaternion Pose Interpolation");
glwin.keyboardfunc = [&](int key, int, int)
{
showaxis = key == 'a' != showaxis;
};
while (glwin.WindowUp())
{
t = t + dt; // advance our global time t is in 0..1
if (t > 1.0f)
t = 0.0f;
Pose pt = dqinterp(p0,p1,t); // And here we show our dual quaterion usage
// some extras to help visualize the axis of rotation, not the best math to get the result, but oh well
float4 aq = qmul(dot(p0.orientation, p1.orientation) < 0 ? -p1.orientation : p1.orientation, qconj(p0.orientation));
float3 axis = normalize(aq.xyz()*(aq.w < 0 ? -1.0f : 1.0f)); // direction of the axis of rotation
float3 axisp = cross(axis, p1.position - p0.position) / 2.0f * sqrtf(1/dot(aq.xyz(),aq.xyz())-1); // origin projected onto the axis of rotation
// user interaction:
float3 ray = qrot(camera.orientation, normalize(glwin.MouseVector)); // for mouse selection
float3 v1 = camera.position + ray*100.0f;
if (!glwin.MouseState) // note that we figure out what is being selected only when the mouse is up
{
selected = NULL;
for (Pose *p : { &p0, &p1 })
{
if (auto h = ConvexHitCheck(planes, *p, camera.position, v1))
{
selected = p;
v1 = h.impact;
}
}
}
else // if (glwin.MouseState)
{
if (selected)
selected->orientation = qmul(VirtualTrackBall(camera.position, selected->position, qrot(camera.orientation, mousevec_prev), qrot(camera.orientation, glwin.MouseVector)), selected->orientation);
else
camera.orientation = qmul(camera.orientation, qconj(VirtualTrackBall(float3(0, 0, 1), float3(0, 0, 0), mousevec_prev, glwin.MouseVector))); // equation is non-typical we are orbiting the camera, not rotating the object
}
camera.position = focuspoint + qzdir(camera.orientation)*magnitude(camera.position - focuspoint);
camera.position -= focuspoint;
camera.position *= powf(1.1f, (float)glwin.mousewheel);
camera.position += focuspoint;
mousevec_prev = glwin.MouseVector;
// Render the scene
glPushAttrib(GL_ALL_ATTRIB_BITS);
glViewport(0, 0, glwin.Width, glwin.Height); // Set up the viewport
glClearColor(0.1f, 0.1f, 0.15f, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glPushMatrix(); glLoadIdentity();
gluPerspective(glwin.ViewAngle, (double)glwin.Width / glwin.Height, 0.25, 250);
glMatrixMode(GL_MODELVIEW);
glPushMatrix(); glLoadIdentity();
glMultMatrixf(camera.Inverse().Matrix());
glDisable(GL_LIGHTING);
glAxis();
glGridxy(4.0f);
if (showaxis)
{
glPushAttrib(GL_ALL_ATTRIB_BITS);
glLineWidth(3.0f);
glBegin(GL_LINES);
glColor3f(1, 1, 1);
for (auto p : { p0.position, p1.position, pt.position ,axisp})
glVertex3fv(p - axis*0.5f), glVertex3fv(p + axis*0.5f); // note the comma
glEnd();
glPopAttrib();
glColor3f(1, 1, 0);
glBegin(GL_LINES);
glVertex3fv(axisp + axis*dot(axis, p0.position)), glVertex3fv(axisp + axis*dot(axis, p1.position));
glVertex3fv(axisp + axis*dot(axis, p0.position)), glVertex3fv(p0.position);
glVertex3fv(axisp + axis*dot(axis, p1.position)), glVertex3fv(p1.position);
glVertex3fv(axisp + axis*dot(axis, pt.position)), glVertex3fv(pt.position);
glEnd();
}
glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_COLOR_MATERIAL);
for (auto p : { p0, p1, pt })
glcolorbox(0.25f, p);
glPopMatrix(); //should be currently in modelview mode
//.........这里部分代码省略.........