private protected static Vector2F CalcScale(Matrix44F transform) { var sx = new Vector3F(transform[0, 0], transform[0, 1], transform[0, 2]).Length; var sy = new Vector3F(transform[1, 0], transform[1, 1], transform[1, 2]).Length; return(new Vector2F(sx, sy)); }
private void UpdateSizeBox() { var points = new Vector2F[4]; var origin = -_TransformNode.CenterPosition * _TransformNode.Scale; points[0] = origin; points[1] = origin + new Vector2F(_TransformNode.ContentSize.X, 0) * _TransformNode.Scale; points[2] = origin + _TransformNode.ContentSize * _TransformNode.Scale; points[3] = origin + new Vector2F(0, _TransformNode.ContentSize.Y) * _TransformNode.Scale; var mat = _TransformNode.GetAncestorSpecificNode <TransformNode>()?.InheritedTransform ?? Matrix44F.Identity; mat = mat * Matrix44F.GetTranslation2D(_TransformNode.Position) * Matrix44F.GetRotationZ(MathHelper.DegreeToRadian(_TransformNode.Angle)); for (int i = 0; i < points.Length; i++) { var vector = mat.Transform3D(new Vector3F(points[i].X, points[i].Y, 0)); points[i] = new Vector2F(vector.X, vector.Y); } for (int i = 0; i < points.Length; i++) { var point1 = points[i]; var point2 = points[(i + 1) % points.Length]; SetLine(_SizeBoxLines[i], point1, point2, new Color(255, 128, 0)); } }
private void UpdateSizeBox() { var points = new Vector2F[4]; var offset = ((AnchorTransformerNode.Parent?.GetAncestorSpecificNode <TransformNode>()?.Transfomer as AnchorTransformerNode)?.Size ?? default) * AnchorTransformerNode.AnchorMin; var origin = -AnchorTransformerNode.CenterPosition; points[0] = origin; points[1] = origin + new Vector2F(AnchorTransformerNode.Size.X, 0); points[2] = origin + AnchorTransformerNode.Size; points[3] = origin + new Vector2F(0, AnchorTransformerNode.Size.Y); var mat = AnchorTransformerNode.Parent.GetAncestorSpecificNode <TransformNode>()?.InheritedTransform ?? Matrix44F.Identity; mat = mat * Matrix44F.GetTranslation2D(offset + AnchorTransformerNode.Position) * Matrix44F.GetRotationZ(MathHelper.DegreeToRadian(AnchorTransformerNode.Angle)); for (int i = 0; i < points.Length; i++) { var vector = mat.Transform3D(new Vector3F(points[i].X, points[i].Y, 0)); points[i] = new Vector2F(vector.X, vector.Y); } for (int i = 0; i < points.Length; i++) { var point1 = points[i]; var point2 = points[(i + 1) % points.Length]; SetLine(_SizeBoxLines[i], point1, point2, new Color(255, 128, 0)); } }
private void UpdateAnchor() { var points = new Vector2F[2]; var offset = ((AnchorTransformerNode.Parent?.GetAncestorSpecificNode <TransformNode>()?.Transfomer as AnchorTransformerNode)?.Size ?? default) * AnchorTransformerNode.AnchorMin; points[0] = -AnchorTransformerNode.Position; points[1] = AnchorTransformerNode.Size * (new Vector2F(1, 1) - AnchorTransformerNode.Pivot) + AnchorTransformerNode.RightBottom; var mat = AnchorTransformerNode.Parent.GetAncestorSpecificNode <TransformNode>()?.InheritedTransform ?? Matrix44F.Identity; mat = mat * Matrix44F.GetTranslation2D(offset + AnchorTransformerNode.Position) * Matrix44F.GetRotationZ(MathHelper.DegreeToRadian(AnchorTransformerNode.Angle)); var horizon = new Vector2F(-8, 0); var vertical = new Vector2F(0, -8); for (int i = 0; i < points.Length; i++) { var point1 = points[i] + horizon * MathF.Pow(-1, i); var point2 = points[i] + vertical * MathF.Pow(-1, i); var vector = mat.Transform3D(new Vector3F(points[i].X, points[i].Y, 0)); points[i] = new Vector2F(vector.X, vector.Y); vector = mat.Transform3D(new Vector3F(point1.X, point1.Y, 0)); point1 = new Vector2F(vector.X, vector.Y); vector = mat.Transform3D(new Vector3F(point2.X, point2.Y, 0)); point2 = new Vector2F(vector.X, vector.Y); SetLine(_AnchorLines[i * 2], points[i], point1, new Color(255, 255, 255)); SetLine(_AnchorLines[i * 2 + 1], points[i], point2, new Color(255, 255, 255)); } }
/// <summary> /// Transformを計算します。 /// </summary> /// <param name="position">座標</param> /// <param name="angle">角度(弧度法)</param> /// <param name="scale">拡大率</param> /// <returns></returns> internal static Matrix44F CalcTransform(Vector2F position, float angle, Vector2F scale) { var matPosition = Matrix44F.GetTranslation2D(position); var matRotate = Matrix44F.GetRotationZ(angle); var matScale = Matrix44F.GetScale2D(scale); return(matPosition * matRotate * matScale); // NOTE: 一気に計算したほうがよさそう }
/// <summary> /// <see cref="Matrix44F"/>から2次元座標,拡大率,角度を算出します。 /// </summary> /// <param name="transform">計算元となる4x4行列</param> /// <param name="absolutePosition">出力される座標</param> /// <param name="scale">出力される拡大率</param> /// <param name="angle">出力される角度(度数法)</param> public static void CalcFromTransform2D(Matrix44F transform, out Vector2F absolutePosition, out Vector2F scale, out float angle) { absolutePosition = new Vector2F(transform[0, 3], transform[1, 3]); var sx = new Vector3F(transform[0, 0], transform[1, 0], transform[2, 0]).Length; var sy = new Vector3F(transform[0, 1], transform[1, 1], transform[2, 1]).Length; scale = new Vector2F(sx, sy); transform *= Matrix44F.GetScale2D(new Vector2F(sx == 0 ? 1f : (1f / sx), sy == 0 ? 1f : (1f / sy))); angle = new Vector2F(transform[0, 0], transform[1, 0]).Degree; }
/// <summary> /// <see cref="Matrix44F"/>から3次元座標,拡大率,角度を算出します。 /// </summary> /// <param name="transform">計算元となる4x4行列</param> /// <param name="absolutePosition">出力される座標</param> /// <param name="scale">出力される拡大率</param> /// <param name="rotation">出力される回転行列</param> public static void CalcFromTransform3D(Matrix44F transform, out Vector3F absolutePosition, out Vector3F scale, out Matrix44F rotation) { absolutePosition = new Vector3F(transform[0, 3], transform[1, 3], transform[2, 3]); var sx = new Vector3F(transform[0, 0], transform[1, 0], transform[2, 0]).Length; var sy = new Vector3F(transform[0, 1], transform[1, 1], transform[2, 1]).Length; var sz = new Vector3F(transform[0, 2], transform[1, 2], transform[2, 2]).Length; scale = new Vector3F(sx, sy, sz); transform = Matrix44F.GetTranslation3D(-absolutePosition) * transform; rotation = transform * Matrix44F.GetScale3D(new Vector3F(sx == 0 ? 1f : (1f / sx), sy == 0 ? 1f : (1f / sy), sz == 0 ? 1f : (1f / sz))); }
private void SetMatrix44FPrivate(string key, Matrix44F value, bool assign) { if (key == null) { throw new ArgumentNullException(nameof(key), "引数がnullです"); } if (assign) { matrixes[key] = value; } cbg_Material_SetMatrix44F(selfPtr, key, value); }
/// <summary> /// 指定した名前を持つ<see cref="Matrix44F"/>の値を設定します。 /// </summary> /// <param name="key">検索する<see cref="Matrix44F"/>のインスタンスの名前</param> /// <param name="value">設定する<see cref="Matrix44F"/>のインスタンスの値</param> /// <exception cref="ArgumentNullException"><paramref name="key"/>がnull</exception> public void SetMatrix44F(string key, Matrix44F value) { SetMatrix44FPrivate(key, value, true); }