让物体绕固定点做圆周运动

int AppWorldLogic::init() {
    
    App::get()->setUpdate(1);
    Visualizer::get()->setEnabled(1);
    m_nodeO = Editor::get()->getNodeByName("material_ball");
    m_node = m_nodeO->clone();
    m_node->setWorldTransform(translate(Vec3(m_x, 0, 0)));
    m_target = m_nodeO->getNodeWorldPosition();
    vec3 left = m_node->getWorldLeft();
    vec3 targetDir = getTvec3(vec3((m_target - m_node->getNodeWorldPosition())));
    m_isleft = dot(targetDir, left) > -0.00001;//根据偏向左边还是右边来判定向左还是向右。当然可以设置只向左或向右
    return 1;
}

int AppWorldLogic::update() {
    //本方法直接设定物体的离心力固定,只绕特定半径来做圆周运动。步骤为先转动方向,再移动到轨道上,再在轨道上运行。
    float ifps = Game::get()->getIFps();
    Vec3 pos = m_node->getNodeWorldPosition();
    vec3 forward = m_node->getWorldForward();
    vec3 left = m_node->getWorldLeft();
    vec3 right = m_node->getWorldRight();
    double currentAcce = m_speed*m_speed / m_radius; //获取离心力加速度
    vec3 up = vec3(0, 0, 1);
    float angle = 0;
    Vec3 centerDir = m_isleft? Vec3(left):Vec3(right);
    vec3 v = forward*m_speed;
    v += vec3(centerDir)*currentAcce*ifps;
    v.z = 0;
    v = v.normalize()*m_speed;
    angle = getAngle(forward, v, up);  //angle between forward an new direction// / 2.0f

    Mat4 mat = m_node->getWorldTransform();
    Vec3 centerPos = pos;
    if (m_isleft)
    {
        centerPos = (mat*translate(Vec3(1, 0, 0)*m_radius)).getTranslate();
    }
    else
    {
        centerPos = (mat*translate(Vec3(-1, 0, 0)*m_radius)).getTranslate();
    }
    vec3 targetDir = vec3(m_target - centerPos).normalize();
    if((centerPos-m_target).length()>m_speed*ifps)//如果做圆周运动的实际圆心与想要的圆心位置不符,先将圆心移动到指定位置,方式为,先旋转再平移
    {
        targetDir = targetDir.normalize();
        forward = forward.normalize();
        Log::message("%f\n", dot(targetDir, forward));
        if (dot(targetDir, forward) > 0.99)
        {
            angle = 0;
        }
    }

    mat = mat*Mat4(quat(up, angle))*translate(Vec3(0, -1, 0)*m_speed*ifps);
    m_node->setWorldTransform(mat);
    return 1;
}
 

猜你喜欢

转载自blog.csdn.net/qiushangren/article/details/85784844
今日推荐