public void SceneRateControlledFly(FScene scene, Camera cam, Vector2 curPos, RateControlInfo rc) { float dt = (FPlatform.RealTime() - rc.lastTime); rc.lastTime = FPlatform.RealTime(); float delta_y = (curPos.y - rc.startPos.y); rc.curSpeedY = rc_update_speed(delta_y, rc.rampUpRadius, rc.deadZoneRadius, rc.maxAccel, rc.maxSpeed, dt, rc.curSpeedY); float delta_x = (curPos.x - rc.startPos.x); rc.curSpeedX = rc_update_speed(delta_x, rc.rampUpRadius, rc.deadZoneRadius, rc.maxAccel, rc.maxSpeed, dt, rc.curSpeedX); Vector3 forward, up; if (rc.StayLevel) { forward = new Vector3(cam.transform.forward.x, 0.0f, cam.transform.forward.z); forward.Normalize(); up = Vector3.up; } else { forward = cam.gameObject.transform.forward; up = cam.gameObject.transform.up; } Vector3 curScenePos = scene.RootGameObject.transform.position; Vector3 newScenePos = curScenePos - dt * rc.curSpeedY * forward; scene.RootGameObject.transform.position = newScenePos; scene.RootGameObject.transform.RotateAround( cam.transform.position, up, -dt * rc.curSpeedX * rc.angleMultipler); }
// in egocentric camera system the "eye" is moving up/down, which means the scene moves in opposite direction public void SceneRateControlledEgogentricPan(FScene scene, fCamera cam, Vector2f curPos, RateControlInfo rc) { float dt = (FPlatform.RealTime() - rc.lastTime); rc.lastTime = FPlatform.RealTime(); float delta_y = (curPos.y - rc.startPos.y); rc.curSpeedY = rc_update_speed(delta_y, rc.rampUpRadius, rc.deadZoneRadius, rc.maxAccel, rc.maxSpeed, dt, rc.curSpeedY); float delta_x = (curPos.x - rc.startPos.x); rc.curSpeedX = rc_update_speed(delta_x, rc.rampUpRadius, rc.deadZoneRadius, rc.maxAccel, rc.maxSpeed, dt, rc.curSpeedX); Frame3f camFrame = cam.GetWorldFrame(); Vector3f forward = camFrame.Z; Vector3f up = camFrame.Y; if (rc.StayLevel) { forward = new Vector3(forward.x, 0.0f, forward.z); forward.Normalize(); up = Vector3.up; } Vector3f right = Vector3.Cross(up, forward); Vector3f curScenePos = scene.RootGameObject.GetPosition(); Vector3f newScenePos = curScenePos - dt * (rc.curSpeedY * up + rc.curSpeedX * right); scene.RootGameObject.SetPosition(newScenePos); }