/// <summary> /// カメラ視点の更新処理 /// </summary> /// <param name="vm">カメラ視点モード</param> private void ViewpointUpdate(ViewpointMode vm) { Ode.Vector3 viewPos = new Ode.Vector3(); // 視点の位置(x, y, z) Ode.Vector3 viewDir = new Ode.Vector3(); // 視点の方向(ヘッド,ピッチ,ロール) // 車の位置行列・回転行列を取得 Ode.Vector3 pos; ; Ode.Matrix3 R; _car.GetStatus(out pos, out R); switch (vm) { case ViewpointMode.Fixed: break; case ViewpointMode.Trace: viewPos.X = pos.X; viewPos.Y = pos.Y; viewPos.Z = 10.0f; viewDir.X = 90.0f; viewDir.Y = -90.0f; viewDir.Z = 0.0f; Ds.SetViewpoint(ref viewPos, ref viewDir); // 視点の設定 break; case ViewpointMode.FirstPerson: Real yaw = (float)Math.Atan2(R.M21, R.M11) / Ode.PI * 180.0f; viewPos.X = pos.X; viewPos.Y = pos.Y; viewPos.Z = 0.5f; viewDir.X = 90.0f - yaw; viewDir.Y = 0.0f; viewDir.Z = 0.0f; Ds.SetViewpoint(ref viewPos, ref viewDir); // 視点の設定 break; } }
/// <summary> /// Drawstuffのコマンド入力時コールバック関数 /// <param name="cmd">コマンド入力</param> /// </summary> private void CommandFunctionCallback(IntPtr cmd) { switch ((char)cmd) { case 'f': _car.speedL += 0.5f; break; case 'd': _car.speedL -= 0.5f; break; case 'j': _car.speedR += 0.5f; break; case 'k': _car.speedR -= 0.5f; break; case 'u': _car.v += 1.0f; break; case 'i': _car.v -= 1.0f; break; case 'y': _car.omega += 0.4f; break; case 'o': _car.omega -= 0.4f; break; case 's': _car.speedR = _car.speedL = 0.0f; break; // カメラ視点:固定 case 'z': _viewPointMode = ViewpointMode.Fixed; break; // カメラ視点:追従 case 'x': _viewPointMode = ViewpointMode.Trace; break; // カメラ視点:一人称視点 case 'c': _viewPointMode = ViewpointMode.FirstPerson; break; } Console.WriteLine("SpeedL: " + _car.speedL.ToString() + ", SpeedR: " + _car.speedR.ToString()); }