我要发帖 回复

中级会员

28

主题

189

积分

0

专家分

:

私信
发表时间 : 2009-4-29 13:25:51 | 浏览 : 1346    评论 : 15
//------------------------------------------------
                // get a pointer to the object
                m_tank = tank;
                m_tank->ref();
        //---------------------------------------------------------
     
        m_LGeometry = new vrGeometry();
        m_LGeometry->setPrimitive(vrGeometry::PRIMITIVE_TRIANGLE_STRIP);
        m_LGeometry->setNumPrimitives(1);

        int *lengthL = vuAllocArray<int>::malloc(1);
        lengthL[0] = 2;
        m_LGeometry->setPrimitiveLengths(lengthL);

        vuVec4<float> *color = vuAllocArray<vuVec4<float> >::malloc(1);
        color[0].set(1.0f, 1.0f, 0.0f, 0.5f);
        m_LGeometry->setColors(color, vrGeometryBase::BINDING_OVERALL);

        vuVec3<float> *vertexL = vuAllocArray<vuVec3<float> >::malloc(s_pathSegments);
        m_LGeometry->setVertices(vertexL);

        m_LGeometry->ref();

                //----------------------------------------------------------------
        m_RGeometry = new vrGeometry();
        m_RGeometry->setPrimitive(vrGeometry::PRIMITIVE_TRIANGLE_STRIP);
        m_RGeometry->setNumPrimitives(1);

                int *lengthR = vuAllocArray<int>::malloc(1);
        lengthR[0] = 2;
        m_RGeometry->setPrimitiveLengths(lengthR);

        m_RGeometry->setColors(color, vrGeometryBase::BINDING_OVERALL);

        vuVec3<float> *vertexR = vuAllocArray<vuVec3<float> >::malloc(s_pathSegments);
        m_RGeometry->setVertices(vertexR);

        m_RGeometry->ref();

        //-------------------------------------------------------------
        // create the path state
        vrState *state = new vrState();

        // enable transparency
        vrAlphaBlend::Element alphaBlendElement;
        alphaBlendElement.m_enable = true;
        alphaBlendElement.m_src = vrAlphaBlend::MODE_SRC_ALPHA;
        alphaBlendElement.m_dst = vrAlphaBlend::MODE_INVERSE_SRC_ALPHA;
        state->setElement(vrAlphaBlend::Element::Id, &alphaBlendElement);
        // disable back face culling so we can see the path from both sides
        vrPolygon::Element polygonElement;
        polygonElement.m_enableCullFace = false;
        state->setElement(vrPolygon::Element::Id, &polygonElement);
        // disable lighting so the fragment color will only be based upon our
        // geometry color
        vrLight::Element lightElement;
        lightElement.m_enable = false;
        state->setElement(vrLight::Element::Id, &lightElement);
        //--------------------------------------------------
        // create a geometry node for the path and add it to the scene graph
        m_LNode = new vsGeometry();
        m_LNode->setGeometry(m_LGeometry);
        m_LNode->setState(state);
        m_LNode->ref();
        //-----------------------------------------
            m_RNode = new vsGeometry();
        m_RNode->setGeometry(m_RGeometry);
        m_RNode->setState(state);
        m_RNode->ref();
        //---------------------------------------------------
        vpScene *scene = *vpScene::begin();
        assert(scene);
        scene->push_back_child(m_LNode);
                scene->push_back_child(m_RNode);
        //-------------------------------------------------------
        // create a render strategy for our path geometry and multi-buffer the
        // primitive lengths and vertex attribute arrays
        m_LFrameGeometry = new vsRenderStrategyFrameGeometry(m_LGeometry,
            vsRenderStrategyFrameGeometry::ATTRIBUTE_PRIMITIVE_LENGTHS |
                        vsRenderStrategyFrameGeometry::ATTRIBUTE_VERTICES);
        m_LFrameGeometry->ref();
        m_LGeometry->setRenderStrategy(m_LFrameGeometry);

                //----------------------------------------------------
                 m_RFrameGeometry = new vsRenderStrategyFrameGeometry(m_RGeometry,
            vsRenderStrategyFrameGeometry::ATTRIBUTE_PRIMITIVE_LENGTHS |
                        vsRenderStrategyFrameGeometry::ATTRIBUTE_VERTICES);
        m_RFrameGeometry->ref();
        m_RGeometry->setRenderStrategy(m_RFrameGeometry);

        // set the initial position  and the path
         updatePath(m_tank);

        return vsgu::SUCCESS;

    }

       
   
    virtual int endFrame(void) const
    {

        // update the position  and update the path
        const_cast<myApp *>(this)-> updatePath(m_tank);

        // let the base class do it's work
        return vpApp::endFrame();

    }


private:

         
    /**
     * update the path
     */
    void updatePath(vpObject *src)
    {

     
        int *lengthL = m_LGeometry->getPrimitiveLengths();
        vuVec3<float> *vertexL = m_LGeometry->getVertices();
        vuVec3<float> L1(-1.9f, -2.0f, 0.01f);
        vuVec3<float> L2(-1.0f, -2.0f, 0.01f);

        int *lengthR = m_RGeometry->getPrimitiveLengths();
                vuVec3<float> *vertexR = m_RGeometry->getVertices();
        vuVec3<float> R1(1.9f, -2.0f, 0.01f);
        vuVec3<float> R2(1.0f, -2.0f, 0.01f);
      
        vuMatrix<float> mf;
        const vuMatrix<double> &md = src->getMatrixAffine().getMatrix();
        vuMatrixTruncate(&mf, md);
        mf.transformPoint(&L1);
        vertexL[lengthL[0] - 2] = L1;
        mf.transformPoint(&L2);
        vertexL[lengthL[0] - 1] = L2;
               
                mf.transformPoint(&R1);
        vertexR[lengthR[0] - 2] = R1;
        mf.transformPoint(&R2);
        vertexR[lengthR[0] - 1] = R2;

  
        static vuVec3<double> lastPos;
        vuVec3<double> pos(md[3][0], md[3][1], md[3][2]);

        if (pos.distance(lastPos) > s_pathSegmentLength)
                {

         
            if (lengthL[0] + 2 < s_pathSegments)
                        {

                vertexL[lengthL[0]] = vertexL[lengthL[0] - 2];
                               
                lengthL[0]++;

                vertexL[lengthL[0]] = vertexL[lengthL[0] - 2];
                               
                lengthL[0]++;

                m_LGeometry->setPrimitiveLengths(lengthL);
                               

            }

            
            else
                        {

                int num = lengthL[0] - 2;

                for (int i=0;i<num;i+=2)
                                {

                    vertexL = vertexL[i + 2];
                    vertexL[i + 1] = vertexL[i + 3];
                }
                        }
                                //-----------------------------
                          if (lengthR[0] + 2 < s_pathSegments)
                          {

                vertexR[lengthR[0]] = vertexR[lengthR[0] - 2];
                               
                lengthR[0]++;

                vertexR[lengthR[0]] = vertexR[lengthR[0] - 2];
                               
                lengthR[0]++;

                m_RGeometry->setPrimitiveLengths(lengthR);
                               

            }

   
            else
                        {

                int num = lengthR[0] - 2;

                for (int i=0;i<num;i+=2)
                                {

                    vertexR = vertexR[i + 2];
                    vertexR[i + 1] = vertexR[i + 3];
                }
           
            }
               
            // save our current position
            lastPos = pos;

        }

        
        m_LGeometry->setVertices(vertexL);
                m_RGeometry->setVertices(vertexR);


        m_LNode->setDirtyMask(vsNode::DIRTY_BOUNDS, vsNode::BITOP_OR);
                m_RNode->setDirtyMask(vsNode::DIRTY_BOUNDS, vsNode::BITOP_OR);

        /
        if (m_LFrameGeometry != NULL) m_LFrameGeometry->update();
                if (m_RFrameGeometry != NULL) m_RFrameGeometry->update();

    }

     
   

   我 这样创建2个几何图形,怎么在几何体上贴上纹理呢?

最近VR访客

castleva 评论于2009-4-29 17:01:33
// 我就在这大概给你写一下吧 ,纯手工制作,无智能感知。。。慎用
// 代码语法是基于2.2版本的 可能在state上会和以前的版本有一些不一样,你自己改一下吧
// 在你创建完vrGeometry后 创建贴图坐标
vuVec2<float> *texCoord = vuallocArray<vuVec2<float>>::malloc(24);
for(int i = 0; i < 6; i ++)
{
       texCoord[i*4].set(0.0f, 3.0f);
       texCoord[i*4 + 1].set(0.0f, 0.0f);
       texCoord[i*4 + 2].set(3.0f, 0.0f);
       texCoord[i*4 + 3].set(3.0f, 3.0f);
}
    m_RGeometry ->setTextureCoords(texCoord); // Set UV

// Read your Textures Files
vrTexture::State *m_textureState;
vrTexture::Blend *m_textureBlend;
vrTexture::Element m_textureElement;
vrTexture *texture;

vrtextureFactory *factory = new vrtextureFactory;
texture = factory->read(fileName); // your texture file should be in search path
factory->unref();
m_textureState = new vrTexture::State;
m_textureState->ref();
m_textureState->setEnable(true);
m_textureState->setTexture(m_texture);

m_textureBlend = new vrtexture::Blend;
m_textureBlend->setColorMode(vrtexture::Blend::MODE_MODULATE);
m_textureBlend->setColor(1.0f, 1.0f, 1.0f, 1.0f);
m_textureBlend->ref();
m_textureState->setTextureBlend(m_textureBlend);
m_textureElement.push_back_texture_state(m_textureState);

// set element into your state
state->setElement(vrtexture::Element::Id, &m_textureElement);
// 你可以按照这个试试 以前你画不出来我也不知道是怎么回事,如果用这个还是不行,你可以把element inster到 vrDrawContext里面试试,如果再不行,我也不清楚了。。。
ppp 评论于2009-4-29 18:15:21
我 这样用了,但不行
ppp 评论于2009-4-29 18:18:48
我用vrDrawContex画但是报错
castleva 评论于2009-4-29 18:44:29
报什么错?
ppp 评论于2009-4-30 11:09:09
m_LFrameGeometry = new vsRenderStrategyFrameGeometry(m_LGeometry,
            vsRenderStrategyFrameGeometry::ATTRIBUTE_PRIMITIVE_LENGTHS |
                        vsRenderStrategyFrameGeometry::ATTRIBUTE_VERTICES);
我设置的是每次使用原始长度,用你的
for(int i = 0; i < 6; i ++)
{
   texCoord[i*4].set(0.0f, 3.0f);
       texCoord[i*4 + 1].set(0.0f, 0.0f);
   texCoord[i*4 + 2].set(3.0f, 0.0f);
     texCoord[i*4 + 3].set(3.0f, 3.0f);

这样贴不行,只能显示一点纹理,我需要怎么改呢?
castleva 评论于2009-4-30 11:43:26
首先你要是用这种方法的话,要先知道你的face才行,我上面的这个是往一个box上面贴的,要是不规则的话我觉的这样就不行了。。。。你先改一下wrap试试看 设置成WRAP_REPEAT 或者你把3.0都改为1.0,看看是什么效果
ppp 评论于2009-4-30 13:59:26
我 是 改成1.0才有 的效果,但是我的几何图形的面片是变化的,有个最大值100,那texCoord应该怎么设置呢??
castleva 评论于2009-4-30 14:22:20
这个。。。。似乎很少有这种手动来给贴图坐标的。。而且像你那种不规则的多边形好像还是动态生成的就更困难了。。。你想实现一个什么效果啊?
ppp 评论于2009-4-30 14:49:43
实现车辙效果~~
ppp 评论于2009-4-30 14:52:02
if (pos.distance(lastPos) > s_pathSegmentLength)
                {

         
            if (lengthL[0] + 2 < s_pathSegments)
                        {

                vertexL[lengthL[0]] = vertexL[lengthL[0] - 2];
                                
                lengthL[0]++;

                vertexL[lengthL[0]] = vertexL[lengthL[0] - 2];
                                
                lengthL[0]++;

                m_LGeometry->setPrimitiveLengths(lengthL);
                                

            }

            
            else
                        {

                int num = lengthL[0] - 2;

                for (int i=0;i<num;i+=2)
                                {

                    vertexL = vertexL[i + 2];
                    vertexL[i + 1] = vertexL[i + 3];
                }
                        }
                                //-----------------------------
                          if (lengthR[0] + 2 < s_pathSegments)
                          {

                vertexR[lengthR[0]] = vertexR[lengthR[0] - 2];
                                
                lengthR[0]++;

                vertexR[lengthR[0]] = vertexR[lengthR[0] - 2];
                                
                lengthR[0]++;

                m_RGeometry->setPrimitiveLengths(lengthR);
                                

            }

   
            else
                        {

                int num = lengthR[0] - 2;

                for (int i=0;i<num;i+=2)
                                {

                    vertexR = vertexR[i + 2];
                    vertexR[i + 1] = vertexR[i + 3];
                }
           
            }
动态生成我是这样实现的~但是纹理怎么实现??
castleva 评论于2009-4-30 14:54:34
那做成长方形的片不就行了? 这样就是4个坐标(0, 1) (0 ,0) (1, 0) (1,1) 只需要4个不就行了?
ppp 评论于2009-4-30 14:59:48
你是说只做一个长的面片???还是将三角条带做成QUAD~~
castleva 评论于2009-4-30 15:03:18
我觉的你可以把贴图按照车辙印来画,只不过图的周围都是半透明的,这样你把图贴到一个一个片上(quad应该也可以不过看上去有点扁。。。),然后再动态的连续生成这个不就行了
ppp 评论于2009-4-30 15:45:28
额~~我有那个贴图,我想问的就是将图贴到面片上,我那个是动态连续变化的片,就是怎么将图贴到连续生成的片上~???
ppp 评论于2009-4-30 15:49:05
就像SUPERDEMO制作的那样~~几何图形是连续变换生成

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-3-5 08:45 PM

返回顶部