<div dir="ltr">Does your "anActor" have the ability to reset the rotation? If so, then you can just reset it and then apply the accumulated rotation as you are doing, e.g.<div><br></div><div><span style="font-size:12.8000001907349px">anActor->SetOrientation(0, 0, 0);</span><span class="im" style="font-size:12.8000001907349px"><br>anActor->RotateWXYZ(wxyz[0], wxyz[1], wxyz[2], wxyz[3]);</span><br></div><div><span class="im" style="font-size:12.8000001907349px"><br></span></div><div><font color="#500050"><span style="font-size:12.8000001907349px">This would be nice because you wouldn't need to store the last rotation to undo it.</span></font></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Aug 6, 2015 at 4:26 PM, Totte Karlsson <span dir="ltr"><<a href="mailto:totte@dunescientific.com" target="_blank">totte@dunescientific.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
Hello Cory,<br>
I was able to use your suggestion and got some code to work, as
follows:<span class=""><br>
<br>
virtual void Execute(vtkObject *caller, unsigned long, void*)<br>
{<br></span><span class="">
static int callCount = 0;<br></span>
static double lastAngle = 0;<br>
static double lastVec[3] = {0,0,0};<span class=""><br>
vtkSmartPointer<vtkTransform> t =
vtkSmartPointer<vtkTransform>::New();<br></span>
static vtkSmartPointer<vtkTransform> lastTransform =
vtkSmartPointer<vtkTransform>::New();<span class=""><br>
vtkBoxWidget *widget =
reinterpret_cast<vtkBoxWidget*>(caller);<br>
widget->GetTransform(t);<br>
<br></span>
double* wxyz = t->GetOrientationWXYZ();<br>
double* lastWXYZ = lastTransform->GetOrientationWXYZ();<br>
<br>
if(anActor)<br>
{<br>
cout<<"CallCount:
"<<callCount<<"Current Angle "<<wxyz[0]<<"
Effective angle:"<< wxyz[0] - lastAngle<<endl;<br>
<br>
//Transform 'back'<br>
anActor->RotateWXYZ(-lastAngle, lastWXYZ[1],
lastWXYZ[2], lastWXYZ[3]);<span class=""><br>
anActor->RotateWXYZ(wxyz[0], wxyz[1], wxyz[2],
wxyz[3]);<br>
}<br>
<br></span>
//Save transform data<br>
lastAngle = wxyz[0] ;<br>
lastVec[0] =wxyz[1];<br>
lastVec[1] =wxyz[2];<br>
lastVec[2] =wxyz[3];<br>
<br>
lastTransform = t;<br>
callCount++;<br>
}<br>
<br>
In the above code, two transformations of the actor are done, in
order to follow the orientation of the widget. 1) to rotate the
actor to its initial position, and 2), applying current
transformation.<br>
<br>
Although the above code works, is there a way to get the
'incremental' transform somehow? I'm a novice about these things so
sorry if asking something obvious...<span class="HOEnZb"><font color="#888888"><br>
<br>
tk</font></span><span class=""><br>
<br>
<br>
<div>On 8/6/2015 7:40 AM, Cory Quammen
wrote:<br>
</div>
</span><div><div class="h5"><blockquote type="cite">
<div dir="ltr">TK,
<div><br>
</div>
<div>You can get the orientation in angle-axis representation
with</div>
<div><br>
</div>
<div>double wxyz[4];</div>
<div>t->GetOrientationWXYZ(wxyz);</div>
<div><br>
</div>
<div>From the docs [1]:</div>
<div><br>
</div>
<div><span style="color:rgb(0,0,0);font-family:Roboto,sans-serif;font-size:14px;line-height:22px">The
angle (w) is in degrees and the axis (xyz) is a unit vector.</span><br>
</div>
<div><br>
</div>
<div>You should be able to apply this rotation to your molecule
model's RotateAboutVector function.</div>
<div><br>
</div>
<div>HTH,</div>
<div>Cory</div>
<div><span style="color:rgb(0,0,0);font-family:Roboto,sans-serif;font-size:14px;line-height:22px"><br>
</span></div>
<div><span style="color:rgb(0,0,0);font-family:Roboto,sans-serif;font-size:14px;line-height:22px">[1] </span><font color="#000000" face="Roboto, sans-serif"><span style="font-size:14px;line-height:22px"><a href="http://www.vtk.org/doc/nightly/html/classvtkTransform.html#aa8244cbab95a2dbb20e94af6e7f16b7f" target="_blank"></a><a href="http://www.vtk.org/doc/nightly/html/classvtkTransform.html#aa8244cbab95a2dbb20e94af6e7f16b7f" target="_blank">http://www.vtk.org/doc/nightly/html/classvtkTransform.html#aa8244cbab95a2dbb20e94af6e7f16b7f</a></span></font></div>
<div><br>
</div>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Wed, Aug 5, 2015 at 8:54 PM, Totte
Karlsson <span dir="ltr"><<a href="mailto:totte@dunescientific.com" target="_blank">totte@dunescientific.com</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
I'm using vtk to visualize 3D models of molecules.<br>
The actual molecular model is decoupled from vtk code, and
visualization is implemented using a model-view kind of
design.<br>
<br>
Currently I have the following challenge. If a user wants to
manipulate the absolute orientation of the molecule, it is
done by manipulating the underlying model using rotation
functions, like RotateX, RotateY, RotateAboutVector, and
translation functions TranslateX, Y etc.<br>
<br>
For now 3D rotations are simply done using two scrollbars,
one horizontal and one vertical, causing the underlying
model being rotated about the vtk viewUP vector and the vtk
cameraPlane normal respectively. This works fine, but is
not so intuitive for the user.<br>
<br>
Instead I believe allowing interaction with something like a
box widget that encapsulates the molecule view, (with
disabled handles), would be better.<br>
<br>
The challenge is how to figure out how to capture the
boxwidgets orientation in a callback, and using this
information in order to manipulate the underlying molecular
model.<br>
<br>
For example, a boxwidget callback (from boxwidget example at
<a href="http://www.vtk.org/Wiki/VTK/Examples/Cxx/Widgets/BoxWidget" rel="noreferrer" target="_blank">http://www.vtk.org/Wiki/VTK/Examples/Cxx/Widgets/BoxWidget</a>):<br>
<br>
class vtkMyCallback : public vtkCommand<br>
{<br>
public:<br>
static vtkMyCallback *New() {
return new vtkMyCallback; }<br>
<br>
virtual void Execute(vtkObject *caller, unsigned long,
void*)<br>
{<br>
vtkSmartPointer<vtkTransform> t =
vtkSmartPointer<vtkTransform>::New();<br>
vtkBoxWidget *widget =
reinterpret_cast<vtkBoxWidget*>(caller);<br>
widget->GetTransform(t);<br>
<br>
double* angles?? = t->GetOrientation();<br>
if(aMoleculeModel)<br>
{<br>
//Use some secret(!) code to manipulate
orientation of a molecule to 'rotate' it together with the
boxWidget<br>
aMoleculeModel->RotateZ(??);<br>
aMoleculeModel->RotateY(??);<br>
aMoleculeModel->RotateZ(??);<br>
}<br>
}<br>
Molecule* aMoleculeModel;<br>
<br>
Anyone seeing how to do this or have some pointers?<br>
<br>
Cheers,<br>
tk<br>
<br>
_______________________________________________<br>
Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a><br>
<br>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank"></a><a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
<br>
Please keep messages on-topic and check the VTK FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ" rel="noreferrer" target="_blank"></a><a href="http://www.vtk.org/Wiki/VTK_FAQ" target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a><br>
<br>
Search the list archives at: <a href="http://markmail.org/search/?q=vtkusers" rel="noreferrer" target="_blank">http://markmail.org/search/?q=vtkusers</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://public.kitware.com/mailman/listinfo/vtkusers" rel="noreferrer" target="_blank">http://public.kitware.com/mailman/listinfo/vtkusers</a><br>
</blockquote>
</div>
<br>
<br clear="all">
<div><br>
</div>
-- <br>
<div>Cory Quammen<br>
R&D Engineer<br>
Kitware, Inc.</div>
</div>
</blockquote>
<br>
</div></div><span class=""><div>-- <br>
<hr size="1">
<table border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td><a href="http://www.dunescientific.com/" target="_blank"><img src="http://www.dunescientific.com/images/email/ds_logo_233x60.png" alt="" border="0" height="40"></a></td>
<td><img src="http://www.dunescientific.com/images/email/spacer.gif" alt="" border="0" height="1" width="15"></td>
<td bgcolor="#cccccc"><img src="http://www.dunescientific.com/images/email/spacer.gif" alt="" border="0" height="1" width="1"></td>
<td><img src="http://www.dunescientific.com/images/email/spacer.gif" alt="" border="0" height="1" width="10"></td>
<td>
<div style="font-size:10px;color:#666666"> Totte Karlsson:
<a href="mailto:totte@dunescientific.com" target="_blank">totte@dunescientific.com</a>
or <a href="tel:%20425%20%20780-9648" value="+14257809648" target="_blank">(425) 780-9648</a><br>
<a href="http://www.dunescientific.com/" target="_blank">http://www.dunescientific.com/</a>
<br>
© 2015 Dune Scientific, LLC. All rights reserved. </div>
</td>
</tr>
</tbody>
</table>
</div>
<br>
<br>
</span></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">Cory Quammen<br>R&D Engineer<br>Kitware, Inc.</div>
</div>