瀏覽代碼

Add c# samples to Vector Math

Kelly thomas 7 年之前
父節點
當前提交
95584177a5
共有 1 個文件被更改,包括 112 次插入15 次删除
  1. 112 15
      tutorials/math/vector_math.rst

+ 112 - 15
tutorials/math/vector_math.rst

@@ -63,10 +63,16 @@ coordinate notation. For example, in Godot the origin is the top-left
 corner of the screen, so to place a 2D node named ``Node2D`` 400 pixels to the right and
 corner of the screen, so to place a 2D node named ``Node2D`` 400 pixels to the right and
 300 pixels down, use the following code:
 300 pixels down, use the following code:
 
 
-::
+.. tabs::
+ .. code-tab:: gdscript GDScript
 
 
     $Node2D.position = Vector2(400, 300)
     $Node2D.position = Vector2(400, 300)
 
 
+ .. code-tab:: csharp
+
+    var node2D = (Node2D) GetNode("Node2D");
+    node2D.Position = new Vector2(400, 300);
+
 Godot supports both :ref:`Vector2 <class_Vector2>` and
 Godot supports both :ref:`Vector2 <class_Vector2>` and
 :ref:`Vector3 <class_Vector3>` for 2D and 3D usage respectively. The same
 :ref:`Vector3 <class_Vector3>` for 2D and 3D usage respectively. The same
 mathematical rules discussed in this article apply for both types.
 mathematical rules discussed in this article apply for both types.
@@ -75,7 +81,8 @@ mathematical rules discussed in this article apply for both types.
 
 
 The individual components of the vector can be accessed directly by name.
 The individual components of the vector can be accessed directly by name.
 
 
-::
+.. tabs::
+ .. code-tab:: gdscript GDScript
 
 
     # create a vector with coordinates (2, 5)
     # create a vector with coordinates (2, 5)
     var a = Vector2(2, 5)
     var a = Vector2(2, 5)
@@ -84,14 +91,28 @@ The individual components of the vector can be accessed directly by name.
     b.x = 3
     b.x = 3
     b.y = 1
     b.y = 1
 
 
+ .. code-tab:: csharp
+
+    // create a vector with coordinates (2, 5)
+    var a = new Vector2(2, 5);
+    // create a vector and assign x and y manually
+    var b = new Vector2();
+    b.x = 3;
+    b.y = 1;
+
 - Adding vectors
 - Adding vectors
 
 
 When adding or subtracting two vectors, the corresponding components are added:
 When adding or subtracting two vectors, the corresponding components are added:
 
 
-::
+.. tabs::
+ .. code-tab:: gdscript GDScript
 
 
     var c = a + b  # (2, 5) + (3, 1) = (5, 6)
     var c = a + b  # (2, 5) + (3, 1) = (5, 6)
 
 
+ .. code-tab:: csharp
+
+    var c = a + b;  // (2, 5) + (3, 1) = (5, 6)
+
 We can also see this visually by adding the second vector at the end of
 We can also see this visually by adding the second vector at the end of
 the first:
 the first:
 
 
@@ -106,11 +127,17 @@ Note that adding ``a + b`` gives the same result as ``b + a``.
 
 
 A vector can be multiplied by a **scalar**:
 A vector can be multiplied by a **scalar**:
 
 
-::
+.. tabs::
+ .. code-tab:: gdscript GDScript
 
 
     var c = a * 2  # (2, 5) * 2 = (4, 10)
     var c = a * 2  # (2, 5) * 2 = (4, 10)
     var d = b / 3  # (3, 6) / 3 = (1, 2)
     var d = b / 3  # (3, 6) / 3 = (1, 2)
 
 
+ .. code-tab:: csharp
+
+    var c = a * 2;  // (2, 5) * 2 = (4, 10)
+    var d = b / 3;  // (3, 6) / 3 = (1, 2)
+
 .. image:: img/vector_mult1.png
 .. image:: img/vector_mult1.png
 
 
 .. note:: Multiplying a vector by a scalar does not change its direction,
 .. note:: Multiplying a vector by a scalar does not change its direction,
@@ -158,20 +185,34 @@ Normalization
 preserving its direction. This is done by dividing each of its components
 preserving its direction. This is done by dividing each of its components
 by its magnitude:
 by its magnitude:
 
 
-::
+.. tabs::
+ .. code-tab:: gdscript GDScript
 
 
     var a = Vector2(2, 4)
     var a = Vector2(2, 4)
     var m = sqrt(a.x*a.x + a.y*a.y)  # get magnitude "m" using the Pythagorean theorem 
     var m = sqrt(a.x*a.x + a.y*a.y)  # get magnitude "m" using the Pythagorean theorem 
     a.x /= m
     a.x /= m
     a.y /= m
     a.y /= m
 
 
+ .. code-tab:: csharp
+
+    var a = new Vector2(2, 4);
+    var m = Mathf.Sqrt(a.x*a.x + a.y*a.y);  // get magnitude "m" using the Pythagorean theorem 
+    a.x /= m;
+    a.y /= m;
+
 Because this is such a common operation, ``Vector2`` and ``Vector3`` provide
 Because this is such a common operation, ``Vector2`` and ``Vector3`` provide
 a method for normalizing:
 a method for normalizing:
 
 
-::
+.. tabs::
+ .. code-tab:: gdscript GDScript
 
 
     a = a.normalized()
     a = a.normalized()
 
 
+ .. code-tab:: csharp
+
+    a = a.Normalized();
+
+
 .. warning:: Because normalization involves dividing by the vector's length,
 .. warning:: Because normalization involves dividing by the vector's length,
              you cannot normalize a vector of length ``0``. Attempting to
              you cannot normalize a vector of length ``0``. Attempting to
              do so will result in an error.
              do so will result in an error.
@@ -196,14 +237,28 @@ Godot, the :ref:`Vector2 <class_Vector2>` class has a ``bounce()`` method
 to handle this. Here is a GDScript example of the diagram above using a
 to handle this. Here is a GDScript example of the diagram above using a
 :ref:`KinematicBody2D <class_KinematicBody2D>`:
 :ref:`KinematicBody2D <class_KinematicBody2D>`:
 
 
-::
 
 
-    var collision = move_and_collide(velocity * delta)  # object "collision" contains information about the collision
+.. tabs::
+ .. code-tab:: gdscript GDScript
+
+    # object "collision" contains information about the collision
+    var collision = move_and_collide(velocity * delta)
     if collision:
     if collision:
         var reflect = collision.remainder.bounce(collision.normal)
         var reflect = collision.remainder.bounce(collision.normal)
         velocity = velocity.bounce(collision.normal)
         velocity = velocity.bounce(collision.normal)
         move_and_collide(reflect)
         move_and_collide(reflect)
-        
+
+ .. code-tab:: csharp
+    
+    // KinematicCollision2D contains information about the collision
+    KinematicCollision2D collision = MoveAndCollide(_velocity * delta);
+    if (collision != null)
+    {
+        var reflect = collision.Remainder.Bounce(collision.Normal);
+        _velocity = _velocity.Bounce(collision.Normal);
+        MoveAndCollide(reflect);
+    }
+
 Dot product
 Dot product
 ~~~~~~~~~~~
 ~~~~~~~~~~~
 
 
@@ -227,11 +282,17 @@ and
 However, in most cases it is easiest to use the built-in method. Note that
 However, in most cases it is easiest to use the built-in method. Note that
 the order of the two vectors does not matter:
 the order of the two vectors does not matter:
 
 
-::
+.. tabs::
+ .. code-tab:: gdscript GDScript
 
 
     var c = a.dot(b)
     var c = a.dot(b)
     var d = b.dot(a)  # these are equivalent
     var d = b.dot(a)  # these are equivalent
 
 
+ .. code-tab:: csharp
+
+    float c = a.Dot(b);
+    float d = b.Dot(a);  // these are equivalent
+
 The dot product is most useful when used with unit vectors, making the
 The dot product is most useful when used with unit vectors, making the
 first formula reduce to just ``cosθ``. This means we can use the dot
 first formula reduce to just ``cosθ``. This means we can use the dot
 product to tell us something about the angle between two vectors:
 product to tell us something about the angle between two vectors:
@@ -259,12 +320,21 @@ the player.
 
 
 In GDScript it would look like this:
 In GDScript it would look like this:
 
 
-::
+.. tabs::
+ .. code-tab:: gdscript GDScript
 
 
     var AP = (P - A).normalized()
     var AP = (P - A).normalized()
     if AP.dot(fA) > 0:
     if AP.dot(fA) > 0:
         print("A sees P!")
         print("A sees P!")
-        
+
+ .. code-tab:: csharp
+
+    var AP = (P - A).Normalized();
+    if (AP.Dot(fA) > 0)
+    {
+        GD.Print("A sees P!");
+    }
+
 Cross product
 Cross product
 ~~~~~~~~~~~~~
 ~~~~~~~~~~~~~
 
 
@@ -281,19 +351,34 @@ If two vectors are parallel, the result of their cross product will be null vect
 
 
 The cross product is calculated like this:
 The cross product is calculated like this:
 
 
-::
+.. tabs::
+ .. code-tab:: gdscript GDScript
 
 
     var c = Vector3()
     var c = Vector3()
     c.x = (a.y * b.z) - (a.z * b.y)
     c.x = (a.y * b.z) - (a.z * b.y)
     c.y = (a.z * b.x) - (a.x * b.z)
     c.y = (a.z * b.x) - (a.x * b.z)
     c.z = (a.x * b.y) - (a.y * b.x)
     c.z = (a.x * b.y) - (a.y * b.x)
 
 
+ .. code-tab:: csharp
+
+    var c = new Vector3();
+    c.x = (a.y * b.z) - (a.z * b.y);
+    c.y = (a.z * b.x) - (a.x * b.z);
+    c.z = (a.x * b.y) - (a.y * b.x);
+
+
+
 In GDScript, you can use the built-in method:
 In GDScript, you can use the built-in method:
 
 
-::
+.. tabs::
+ .. code-tab:: gdscript GDScript
 
 
     var c = a.cross(b)
     var c = a.cross(b)
 
 
+ .. code-tab:: csharp
+
+    var c = a.Cross(b);
+
 .. note:: In the cross product, order matters. ``a.cross(b)`` does not
 .. note:: In the cross product, order matters. ``a.cross(b)`` does not
           give the same result as ``b.cross(a)``. The resulting vectors
           give the same result as ``b.cross(a)``. The resulting vectors
           point in **opposite** directions.
           point in **opposite** directions.
@@ -308,7 +393,8 @@ subtraction to find two edges ``AB`` and ``AC``. Using the cross product,
 
 
 Here is a function to calculate a triangle's normal in GDScript:
 Here is a function to calculate a triangle's normal in GDScript:
 
 
-::
+.. tabs::
+ .. code-tab:: gdscript GDScript
 
 
     func get_triangle_normal(a, b, c):
     func get_triangle_normal(a, b, c):
         # find the surface normal given 3 vertices
         # find the surface normal given 3 vertices
@@ -317,6 +403,17 @@ Here is a function to calculate a triangle's normal in GDScript:
         var normal = side1.cross(side2)
         var normal = side1.cross(side2)
         return normal
         return normal
 
 
+ .. code-tab:: csharp
+
+    Vector3 GetTriangleNormal(Vector3 a, Vector3 b, Vector3 c)
+    {
+        // find the surface normal given 3 vertices
+        var side1 = b - a;
+        var side2 = c - a;
+        var normal = side1.Cross(side2);
+        return normal;
+    }
+
 Pointing to a Target
 Pointing to a Target
 --------------------
 --------------------