基于距离场的程序建模——实现基本实体组合的平滑过渡

基于OSG的测试节点的构建

float sdSphere(osg::Vec3 p, float r)
{
    return p.length() - r;
}

float sdPlane(osg::Vec3 p)
{
    return 5.0 - p.z();
}

float sdEllipsoid(osg::Vec3 p, osg::Vec3 r)
{
    float k0 = osg::componentDivide(p, r).length();
    float k1 = osg::componentDivide(p, (osg::componentMultiply(r, r))).length();
    return k0 * (k0 - 1.0) / k1;
}

float opSmoothUnion(float d1, float d2, float k)
{
    float h = std::max(k - abs(d1 - d2), 0.0f);
    return std::min(d1, d2) - h * h * 0.25 / k;
}

osg::Node* sdf_test()
{
    osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;

    int cnt  = 161;
    double size = 30.0;
    double step = size / (double)cnt;
    for (int i = 0; i < cnt; ++i)
    {
        osg::Vec3 ro = osg::Vec3(i * step - size * 0.5, 0.0, 0.0);
        osg::Vec3 rd = osg::Vec3(0.0, 0.0, 1.0);

        float t = 0.0;
        for (int j = 0; j < 64; ++j) {
            osg::Vec3 p = ro + rd * t;
            float d  = sdSphere(p - osg::Vec3(0.0, 0.0, 20), 12.0);
            //d = opSmoothUnion(d, sdSphere(p - osg::Vec3(0, 0.0, 5), 3.0), 0.5);
            //d = opSmoothUnion(d, sdPlane(p), 0.85);
            //d = std::min(d, sdSphere(p - osg::Vec3(0, 0.0, 5), 3.0));

            d = opSmoothUnion(d, sdEllipsoid(p - osg::Vec3(0.0, 0.0, 12.0), osg::Vec3(6.0, 6.0, sqrt(7.8 * 6.0))), 0.25);
            //d = opSmoothUnion(d, sdSphere(p - osg::Vec3(0.0, 0.0, 13.0), 7.8), 0.25);

            if(abs(d) < 0.001 || t > size)
                break;

            t += d;
        }

        if(t < size)
        {
            osg::Vec3 iPoint = ro + rd * t;
            vertices->push_back(iPoint);
        }
    }

    osg::ref_ptr<osg::Geometry> lgeom = new osg::Geometry;
    {
        lgeom->setVertexArray(vertices);
        osg::Vec4Array* colors = new osg::Vec4Array;
        {
            for (int i = 0; i < vertices->size(); ++i)
            {
               osg::Vec3 cdir = vertices->at(i) - osg::Vec3(0.0, 0.0, 20.0); cdir.normalize();
               if(cdir * osg::Vec3(0.0, 0.0, -1.0) < sqrt(3.0) / 2.0)
               {
                   colors->push_back(osg::Vec4(1.0, 0.0, 0.0, 1.0)); continue;
               }
               colors->push_back(osg::Vec4(1.0, 1.0, 0.0, 1.0));
            }

            lgeom->setColorArray(colors, osg::Array::BIND_PER_VERTEX);
        }
        lgeom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP, 0, vertices->size()));

        lgeom->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
    }

    return lgeom.release();
}

通过opSmoothUnion函数的第三个参数来调节平滑过渡的程度(0.0, 1.0),结果对比

0.001
0.001

 

0.901
0.901

 

控制系统建模与仿真——基于matlab/simulink的分析与实现 pdf是一本介绍使用MATLAB/Simulink软件进行控制系统建模和仿真的电子书。本书详细介绍了控制系统建模基本原理和方法,并结合MATLAB/Simulink软件进行实际操作和实现。 本书的主要内容包括控制系统的基本概念和建模方法、MATLAB/Simulink软件的基本操作和仿真环境配置、控制系统的传递函数和状态空间表示、MATLAB/Simulink中的系统建模和仿真技术、控制系统的线性化和频域分析、控制系统的校正和参数调整等。 通过阅读这本书,读者可以了解控制系统建模和仿真的基本原理和方法,能够熟练使用MATLAB/Simulink软件进行控制系统建模和仿真。读者可以通过实际的例子来加深对控制系统建模和仿真的理解,并通过实验和实践来提高自己的控制系统建模和仿真能力。 这本电子书适用于控制工程、自动化、电子工程等相关专业的大学本科生和研究生,也适用于从事控制系统设计和工程实践的工程师和技术人员。通过学习这本书,读者不仅可以提高自己的技术水平和实践能力,还可以为以后的工作和学习打下坚实的基础。 综上所述,控制系统建模与仿真——基于matlab/simulink的分析与实现pdf是一本介绍MATLAB/Simulink软件在控制系统建模和仿真中的应用的电子书,适合控制工程和相关专业的学生和从业人员阅读和学习。它可以帮助读者掌握控制系统建模和仿真的基本原理和方法,并提高自己的技术水平和实践能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值