当前位置: 首页>>代码示例>>C++>>正文


C++ Matrix4::TransformVertex方法代码示例

本文整理汇总了C++中Matrix4::TransformVertex方法的典型用法代码示例。如果您正苦于以下问题:C++ Matrix4::TransformVertex方法的具体用法?C++ Matrix4::TransformVertex怎么用?C++ Matrix4::TransformVertex使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在Matrix4的用法示例。


在下文中一共展示了Matrix4::TransformVertex方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: Transform

void Line::Transform(const Matrix4& m)
{
    HELIUM_MATH_FUNCTION_TIMER();

    m.TransformVertex(m_Origin);
    m.TransformVertex(m_Point);
}
开发者ID:daillen,项目名称:Math,代码行数:7,代码来源:Line.cpp

示例2: DrawHiddenBack

void PrimitiveCircle::DrawHiddenBack(DrawArgs* args, const SceneGraph::Camera* camera, const Matrix4& m) const
{
#ifdef VIEWPORT_REFACTOR
    if (!SetState())
        return;

    int i = 0, count = 0;
    float stepAngle = (float32_t)HELIUM_TWOPI / (float32_t)(m_RadiusSteps);

    Vector3 position (m.t.x, m.t.y, m.t.z);

    Vector3 cameraVector;
    camera->GetPosition(cameraVector);
    cameraVector -= position;
    cameraVector.Normalize();

    for (int x=0; x<m_RadiusSteps; x++)
    {
        float theta = (float32_t)(x) * stepAngle;

        // circle point 1
        Vector3 v1 (0.0f, (float32_t)(cos(theta)) * m_Radius, (float32_t)(sin(theta)) * m_Radius);

        // circle point 2
        Vector3 v2 (0.0f, (float32_t)(cos(theta + stepAngle)) * m_Radius, (float32_t)(sin(theta + stepAngle)) * m_Radius);

        // middle point of circle segment
        Vector3 v = (v1 + v2) * 0.5f;

        // in global space
        m.TransformVertex(v);

        v -= position;
        v.Normalize();

        // if not pointing away from the camera vector, render
        if (v.Dot(cameraVector) > 1.0f - HELIUM_CRITICAL_DOT_PRODUCT)
        {
            m_Device->DrawPrimitive(D3DPT_LINELIST, (UINT)GetBaseIndex()+i, 1);
            count++;
        }

        // increment vertex offset
        i+=2;
    }

    args->m_LineCount += count;
#endif
}
开发者ID:euler0,项目名称:Helium,代码行数:49,代码来源:PrimitiveCircle.cpp

示例3: CenterTransform

UndoCommandPtr Curve::CenterTransform()
{
    BatchUndoCommandPtr batch = new BatchUndoCommand();

    batch->Push( Base::CenterTransform() );

    if ( GetNumberControlPoints() == 0 )
    {
        return batch;
    }


    //
    // We are going to move all control points, so just snap shot
    //

    batch->Push( SnapShot() );


    //
    // Compute the centered position
    //

    Vector3 position = Vector3::Zero;

    {
        uint32_t controlPointCount = 0;
        OS_HierarchyNodeDumbPtr::Iterator childItr = GetChildren().Begin();
        OS_HierarchyNodeDumbPtr::Iterator childEnd = GetChildren().End();
        for ( ; childItr != childEnd; ++childItr )
        {
            CurveControlPoint* point = Reflect::SafeCast< CurveControlPoint >( *childItr );
            if ( point )
            {
                ++controlPointCount;
                position += point->GetPosition();
            }
        }
        position /= (float32_t)controlPointCount;
    }

    m_GlobalTransform.TransformVertex( position );


    //
    // Offset the control points
    //

    Matrix4 m = m_GlobalTransform;

    m.t = position;

    m = m_GlobalTransform * m.Inverted();

    {
        OS_HierarchyNodeDumbPtr::Iterator childItr = GetChildren().Begin();
        OS_HierarchyNodeDumbPtr::Iterator childEnd = GetChildren().End();
        for ( ; childItr != childEnd; ++childItr )
        {
            CurveControlPoint* point = Reflect::SafeCast< CurveControlPoint >( *childItr );
            if ( point )
            {
                Vector3 p = point->GetPosition();

                m.TransformVertex( p );

                batch->Push( new PropertyUndoCommand< Vector3 >( new Helium::MemberProperty< CurveControlPoint, Vector3 >( point, &CurveControlPoint::GetPosition, &CurveControlPoint::SetPosition ), p ) );
            }
        }
    }


    //
    // Recompute global transform
    //

    // our new global transform is just translated to the new position
    m_GlobalTransform.t = position;

    // this will recompute the local components
    SetGlobalTransform( m_GlobalTransform );

    // update the transform object
    Evaluate( GraphDirections::Downstream );

    // update each child's local transform to stay in the same global position
    for ( OS_HierarchyNodeDumbPtr::Iterator itr = m_Children.Begin(), end = m_Children.End(); itr != end; ++itr )
    {
        HierarchyNode* n = *itr;

        Transform* t = Reflect::SafeCast<Transform>( n );

        if ( !t )
        {
            continue;
        }

        batch->Push( t->ComputeObjectComponents() );
    }

//.........这里部分代码省略.........
开发者ID:euler0,项目名称:Helium,代码行数:101,代码来源:Curve.cpp

示例4: PickAxis

AxesFlags PrimitiveAxes::PickAxis(const Matrix4& transform, Line pick, float32_t err)
{
    Vector3 offset;
    float32_t minX = m_Length, minY = m_Length, minZ = m_Length;

    Vector3 axisOrigin (Vector3::Zero);
    Vector3 axisEnd (m_Length, 0.f, 0.f);

    transform.TransformVertex (axisOrigin);
    transform.TransformVertex (axisEnd);

    if (pick.IntersectsSegment (axisOrigin, axisEnd, err, NULL, &offset))
    {
        float32_t dist = offset.Length();
        if (dist > 0.0f && dist < minX)
        {
            minX = dist;
        }
    }

    axisEnd = Vector3(0.f, m_Length, 0.f);
    transform.TransformVertex (axisEnd);

    if (pick.IntersectsSegment (axisOrigin, axisEnd, err, NULL, &offset))
    {
        float32_t dist = offset.Length();
        if (dist > 0.0f && dist < minY)
        {
            minY = dist;
        }
    }

    axisEnd = Vector3(0.f, 0.f, m_Length);
    transform.TransformVertex (axisEnd);

    if (pick.IntersectsSegment (axisOrigin, axisEnd, err, NULL, &offset))
    {
        float32_t dist = offset.Length();
        if (dist > 0.0f && dist < minZ)
        {
            minZ = dist;
        }
    }

    if ((minX == minY) && (minY == minZ))
    {
        return MultipleAxes::None;
    }

    if (minX <= minY && minX <= minZ)
    {
        return MultipleAxes::X;
    }

    if (minY <= minX && minY <= minZ)
    {
        return MultipleAxes::Y;
    }

    if (minZ <= minX && minZ <= minY)
        return MultipleAxes::Z;

    return MultipleAxes::None;
}
开发者ID:euler0,项目名称:Helium,代码行数:64,代码来源:PrimitiveAxes.cpp


注:本文中的Matrix4::TransformVertex方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。