private void checkTranslation() { Vector2 delta = _dragController.Delta; カメラ cp = RenderContext.Instance.行列管理.ビュー行列管理; Vector3 transformedAxis = Vector3.TransformNormal(Vector3.UnitY, //UnitY=(0,1,0) モデル状態.ローカル変換行列 * cp.ビュー行列); //カメラから見たコーンの中心軸ベクトルを求める。 //Transformer.Transformはモデルのローカル変形行列, //cp.ViewMatrixはカメラのビュー変換行列 transformedAxis.Normalize(); Vector3 cp2la = cp.カメラの注視点 - cp.カメラの位置; //カメラの注視点からカメラの位置を引き目線のベクトルを求める //画面上での奥行きにあたるZベクトル cp2la.Normalize(); //正規化 Vector3 xUnit = Vector3.Cross(Vector3.UnitZ, Vector3.TransformNormal(cp.カメラの上方向ベクトル, cp.ビュー行列)); //カメラの上方向ベクトルと目線のベクトルの外積を求め、 //現在のカメラ位置における画面上のX軸方向が3DCG空間上で //どのベクトルで表されるか求める xUnit.Normalize(); //正規化 Vector3 yUnit = Vector3.Cross(xUnit, Vector3.UnitZ); //xUnitとcp2laにより画面上でのy軸が3DCG空間上でどのベクトルに //移されるのか求める。|xUnit|=|cp2la|=1のため、正規化は不要 Vector3 deltaInDim3 = xUnit * delta.X + yUnit * delta.Y; //マウスの移動ベクトルを3CCG空間上で表すベクトルを求める。 float dist = -Vector3.Dot(deltaInDim3, transformedAxis) / 10f; OnTranslated?.Invoke(this, new TranslatedEventArgs(dist * Vector3.TransformNormal(Vector3.UnitY, モデル状態.ローカル変換行列))); }
/// <param name="delta"> /// マウスの画面上の座標の偏移量 /// </param> private float _calculateLength(Vector2 delta) { カメラ cp = RenderContext.Instance.行列管理.ビュー行列管理; Vector3 transformedAxis = Vector3.TransformNormal(Vector3.UnitY, //UnitY=(0,1,0) モデル状態.ローカル変換行列 * cp.ビュー行列); //カメラから見たシリンダの中心軸ベクトルを求める。 //Transformer.Transformはモデルのローカル変形行列, //cp.ViewMatrixはカメラのビュー変換行列 Vector3 cp2la = cp.カメラの注視点 - cp.カメラの位置; //カメラの注視点からカメラの位置を引き目線のベクトルを求める //画面上での奥行きにあたるZベクトル cp2la.Normalize(); //正規化 Vector3 transformUnit = Vector3.Cross(Vector3.UnitZ, transformedAxis); //カメラから見ているので(0,0,1)とシリンダの中心軸ベクトルの外積によって求まるベクトルが //このシリンダにとっての値を上下するときの方向ベクトルとして求まる。 transformUnit.Normalize(); //正規化 Vector3 xUnit = Vector3.Cross(Vector3.UnitZ, Vector3.TransformNormal(cp.カメラの上方向ベクトル, cp.ビュー行列)); //カメラの上方向ベクトルと目線のベクトルの外積を求め、 //現在のカメラ位置における画面上のX軸方向が3DCG空間上で //どのベクトルで表されるか求める xUnit.Normalize(); //正規化 Vector3 yUnit = Vector3.Cross(xUnit, Vector3.UnitZ); //xUnitとcp2laにより画面上でのy軸が3DCG空間上でどのベクトルに //移されるのか求める。|xUnit|=|cp2la|=1のため、正規化は不要 Vector3 deltaInDim3 = xUnit * delta.X + yUnit * delta.Y; //マウスの移動ベクトルを3CCG空間上で表すベクトルを求める。 return(Vector3.Dot(deltaInDim3, transformUnit)); //マウスの移動ベクトルとシリンダの値の上下のための方向ベクトルに //どの程度含まれてるか求めるため内積を求め、これを偏移量の基準とする。 }
public void モーションを更新する(カメラ cp, 射影 proj) { t += 0.01f; //tに応じて三角関数によりカメラの位置を変更する cp.カメラの位置 = new Vector3(0, 0, (float)Math.Sin(t) * 50); /* * 説明: * CameraProvider.CameraPositionがカメラの位置を指す * CameraProvider.CameraLookAtがカメラの注視点を指す * CameraProvider.CameraUpVecがカメラの上方向ベクトルを指す * * IProjectionMatrixProviderのプロパティは以下 * ・ZNear 近クリップ距離 * ・ZFar 遠クリップ距離 * ・AspectRatio アスペクト比 * ・Fovy 視野角 */ }