[vtkusers] Problem with vtkActor->SetOrigin()

Anant Vemuri ajar108 at gmail.com
Wed May 26 07:41:06 EDT 2010


Honestly, I am not doing much... Here is my buildPipeline() function. I load
my transforms in another function. I know they are working properly, because
the movement of the object is as predicted. However, I want to apply the
transform with respect to a point different from the default origin so I
want to use SetOrigin.

There is one other thing. I am getting the polyData from another source. I
make a copy of it in a member variable of my class m_polydata, and I use it
to build my pipeline, I first run buildPipeline and when I actually load my
object model I run updateMesh. But I believe this should not be a problem.

void updateMesh( TriangularMesh::sptr mesh  )
{
    m_polyData = toVTKMesh(mesh);
    m_mapper->SetInput( m_polyData );
    this->setVtkPipelineModified();
}

//----------------------------------------------------------------------------------------------------------

void TriangularMesh::buildPipeline( )
{
    m_actor->GetProperty()->SetColor( m_color->red() , m_color->green() ,
m_color->blue() );
    m_actor->SetMapper( m_mapper );
    if ( m_configuration->hasAttribute( "origin" ) )
    {
        m_actor->SetOrigin( -0.443477, -0.285047, 10.1173 );
        //m_actor->SetPosition( -4.43477, -2.85047, 101.173 );
        //m_defaultTrf->Translate( -4.43477, -2.85047, 101.173 );
    }

    if (m_scale>1)
    {
        m_actor->SetScale( m_scale, m_scale, m_scale );    /// This is the
only other thing I dont know if it is affecting anything. But I turned this
off to check, and got same result
    }

    if( !this->getTransformId().empty() ) /// I read the transform from a
file, and check if it exists
    {
        m_defaultTrf->PostMultiply();
        m_defaultTrf->Concatenate( this->getTransform() );
    }


//////////////////////////////////////////////////////////////////////////////////////////
    if ( m_configuration->hasAttribute( "concatTransform" ) )   /// In this
particular case this is not being used. So this particular part is not
executed.
    {
        std::string vtktrfID( m_configuration->getAttributeValue(
"concatTransform" ) );
        vtkTransform *concatTrf = vtkTransform::New();
        concatTrf->SetInput( vtkTransform::SafeDownCast( this->getVtkObject(
vtktrfID ) ) );
        concatTrf->Inverse();
        m_defaultTrf->Concatenate( concatTrf );
    }

    /// USER TRANSFORM
    m_actor->SetUserTransform( m_defaultTrf );
    this->setVtkPipelineModified();
}

Thank you for your help.

Best regards,
Anant.


-----------
Anant S. Vemuri
email: ajar108 at gmail.com



On Wed, May 26, 2010 at 7:17 PM, 王君臣 <wangjunchen at gmail.com> wrote:

> it seems strange...
> if you only set the origin by SetOrigin and keep others 0 or identity, it
> should take no effect...
> please notice the setposition, in your test, is it (0, 0, 0) ?
> if everything is paid enough attention, could you please post your code
> snippet?
>
>
>
> 2010/5/26 Anant Vemuri <ajar108 at gmail.com>
>
>> Thank you Wang. I went through the file and also the documentation. Here
>> are the steps I did to test,
>>
>> 1. I applied nothing, no SetOrigin(), no SetUserTransform() and put my
>> object in the scene. - image name = nothing_applied.jpg
>> 2. The I apply SetOrigin(-0.443477, -0.285047, 10.1173), and no
>> SetUserTransform() this gives me result shown in image =
>> setOrigin_applied.jpg
>>
>> From what I read in your email and the documentation, this should not
>> happen, right? Or am I interpreting it wrong. If not, then this is what is
>> baffling me.
>>
>> Best regards,
>> Anant.
>>
>>
>> -----------
>> Anant S. Vemuri
>> email: ajar108 at gmail.com
>>
>>
>>
>> 2010/5/26 王君臣 <wangjunchen at gmail.com>
>>
>>
>>> Hi, sorry for my uncompleted explanation. Now let's study the
>>> underlying mechanism of "SetOrigin etc." together.
>>> here is the source code of vtkProp3D::ComputeMatrix (vtk 5.4)
>>>
>>> void vtkProp3D::ComputeMatrix()
>>> {
>>>   if (this->IsIdentity)
>>>     {
>>>     return;
>>>     }
>>>   // check whether or not need to rebuild the matrix
>>>   if ( this->GetMTime() > this->MatrixMTime )
>>>     {
>>>     this->GetOrientation();
>>>     this->Transform->Push();
>>>     this->Transform->Identity();
>>>     this->Transform->PostMultiply();
>>>      //* Notice This Code segment*
>>>     // begin {
>>>     // shift back to actor's origin
>>>     this->Transform->Translate(-this->Origin[0],
>>>                               -this->Origin[1],
>>>                               -this->Origin[2]);
>>>     // scale
>>>     this->Transform->Scale(this->Scale[0],
>>>                           this->Scale[1],
>>>                           this->Scale[2]);
>>>     // rotate
>>>     this->Transform->RotateY(this->Orientation[1]);
>>>     this->Transform->RotateX(this->Orientation[0]);
>>>     this->Transform->RotateZ(this->Orientation[2]);
>>>     // move back from origin and translate
>>>     this->Transform->Translate(this->Origin[0] + this->Position[0],
>>>                               this->Origin[1] + this->Position[1],
>>>                               this->Origin[2] + this->Position[2]);
>>>     //}end ==> it means: at first, the actor frame is an identity (same
>>> with the world frame), then you have a chance to rotate or/and scale the
>>> identity frame with respect to a point (specified by setorigin) in the world
>>> frame. after that, the usermatrix takes efforts.
>>>     // apply user defined transform last if there is one
>>>     if (this->UserTransform)
>>>       {
>>>       this->Transform->Concatenate(this->UserTransform->GetMatrix());
>>>       }
>>>     this->Transform->PreMultiply();
>>>     this->Transform->GetMatrix(this->Matrix);
>>>     this->MatrixMTime.Modified();
>>>     this->Transform->Pop();
>>>     }
>>> }
>>> 2010/5/26 Anant Vemuri <ajar108 at gmail.com>
>>>
>>> Hi,
>>>>
>>>> I had posted a problem a few days back that I am still having with using
>>>> vtkActor->SetOrigin(). The documentation of vtkProp3D says that
>>>> SetOrigin(pos) function sets the point of rotation to the point specified by
>>>> pos. However, when I apply SetOrigin(pos), my actor moves in the scene such
>>>> that his point is at the world origin. For example, if I do SetOrigin(100,
>>>> 100, 100), the actor moves such that the previous (100,100,100) is now at
>>>> (0,0,0) initially before I apply any other transform to it. The effect is
>>>> similar to when I do
>>>>
>>>> m_transform->Translate( -100,-100,-100 );
>>>> m_actor->SetUserTransform( m_transform );
>>>>
>>>>
>>>> Is this what is expected? Becase from the documentation, I understood
>>>> that it should do translate(-newOrigin) [rotations, scaling etc]
>>>> translate(newOrigin). Should I expect that when I do
>>>> vtkActor->SetOrigin(newOrigin), the newOrigin moves to the world (0,0,0).
>>>> Can someone explain this to me?
>>>>
>>>> Thank you.
>>>> Anant.
>>>>
>>>>
>>>> On Mon, May 24, 2010 at 11:27 PM, Anant Vemuri <ajar108 at gmail.com>wrote:
>>>>
>>>>> Thanks... But doesn't SetUserTransform() do that already... the vtk
>>>>> documentation says as below...
>>>>>
>>>>> I think I understand the problem, but not sure how to correct it... I
>>>>> am attaching a transform as the base transform which means that all
>>>>> the other operations such as SetOrigin(), SetScale() get overridden.
>>>>>
>>>>>
>>>>> On 5/24/10, 王君臣 <wangjunchen at gmail.com> wrote:
>>>>> > what you need is a multiplication (PostMultiply) of m_defaultTrf to
>>>>> the
>>>>> > current actor transform not a replacement.
>>>>> >
>>>>> >
>>>>> > 2010/5/24 Anant Vemuri <ajar108 at gmail.com>
>>>>> >
>>>>> >> Hi,
>>>>> >>
>>>>> >> I am trying to use myVtkActor->SetOrigin(origin) to set the origin
>>>>> so that
>>>>> >> any rotations I apply is done about this point. This is what I do to
>>>>> build
>>>>> >> the pipeline
>>>>> >>
>>>>> >>
>>>>> >> void buildPipeline( )
>>>>> >> {
>>>>> >>     m_actor->SetMapper( m_mapper );
>>>>> >>     m_actor->SetOrigin( 100, 100, 100 );
>>>>> >>     m_defaultTrf->Scale(m_scale, m_scale, m_scale);
>>>>> >>     m_defaultTrf->PostMultiply();
>>>>> >>     m_defaultTrf->Concatenate( this->getTransform() );
>>>>> >>     /// I add some more things to the m_defaultTrf
>>>>> >>     .
>>>>> >>     .
>>>>> >>     .
>>>>> >>     m_actor->SetUserTransform( m_defaultTrf );
>>>>> >>     }
>>>>> >>     std::cout << "\n\n\nOrigin = [" << m_actor->GetOrigin()[0] << ",
>>>>> " <<
>>>>> >> m_actor->GetOrigin()[1] << ", " << m_actor->GetOrigin()[2] <<
>>>>> "]\n\n\n";
>>>>> >> }
>>>>> >>
>>>>> >> But when I apply the transform in the scene, it is not being about
>>>>> some
>>>>> >> other point entirely. I noticed that this is the same point when I
>>>>> remove
>>>>> >> the SetOrigin() line. But in the last line it gives me the origin as
>>>>> the
>>>>> >> one
>>>>> >> that I set a few line earlier. I am not able to figure out what is
>>>>> the
>>>>> >> mistake. Can anyone help me?
>>>>> >>
>>>>> >> Thank you.
>>>>> >> Anant.
>>>>> >>
>>>>> >> _______________________________________________
>>>>> >> Powered by www.kitware.com
>>>>> >>
>>>>> >> Visit other Kitware open-source projects at
>>>>> >> http://www.kitware.com/opensource/opensource.html
>>>>> >>
>>>>> >> Please keep messages on-topic and check the VTK FAQ at:
>>>>> >> http://www.vtk.org/Wiki/VTK_FAQ
>>>>> >>
>>>>> >> Follow this link to subscribe/unsubscribe:
>>>>> >> http://www.vtk.org/mailman/listinfo/vtkusers
>>>>> >>
>>>>> >>
>>>>> >
>>>>> >
>>>>> > --
>>>>> >
>>>>>
>>>>>
>>>>> --
>>>>> -----------
>>>>> Anant S. Vemuri
>>>>> email: ajar108 at gmail.com
>>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Powered by www.kitware.com
>>>>
>>>> Visit other Kitware open-source projects at
>>>> http://www.kitware.com/opensource/opensource.html
>>>>
>>>> Please keep messages on-topic and check the VTK FAQ at:
>>>> http://www.vtk.org/Wiki/VTK_FAQ
>>>>
>>>> Follow this link to subscribe/unsubscribe:
>>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>>>
>>>>
>>>
>>>
>>> --
>>>
>>>
>>
>
>
> --
> 人生就像一个刷牙缸,你可以认为它是杯具,也可以认为它是洗具
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20100526/5442e57d/attachment.htm>


More information about the vtkusers mailing list