كيف جمعت فيزياء العجلة في Unigine

يوم جيد.

هذه المرة سنتحدث عن محرك Unigine الروسي ، وكيفية تجميع آلة بسيطة فيه. المخطط ليس مثاليًا ، لأنني لم أحسبه في بعض الأشياء ، ولكن على الأقل سأشارك تجربتي.



بادئ ذي بدء ، لفهم كيفية عمل فيزياء العجلات ، نذهب إلى الوثائق الرسمية ونجد هذا المثال .

بالمناسبة ، لاحظ أن هذا مثال لمفاصل العجلات ، ولكن لسبب ما يقع على العنوان / car_suspension_joints /. تحتاج أيضًا إلى التأكد من عدم تخطي الوثائق إلى الإصدارات القديمة (أي أن DOCS (2.11) مفتوح) ووضع علامة على المربع "C #" أعلى المقالة.

بعد دراسة المثال ، نرى أنه تم كتابته عن طريق القياس مع حل C ++ المبكر. أي أن كل شيء يتم إنشاؤه من خلال التعليمات البرمجية. لقد وصلنا كثيرًا من أجل البرمجة المرئية. حسنًا ، ليس كل شيء حزينًا جدًا ، ولكن يمكنك أن ترى كيف يتم كل هذا في التعليمات البرمجية. وبعد الركض على الروابط ، احصل على فكرة عامة عن جهاز مفصل العجلات وإعدادات الفيزياء.
( ). , -, UnigineScript, . LOD'.
بالطبع ، كنت أتوقع دليلاً جاهزًا خطوة بخطوة حول التجميع البصري من أجل الحصول على شيء متدحرج ، يكلف القليل من الدم. ونتيجة لذلك ، كان لا يزال علي أن أغوص في كل ذلك برأسي من أجل تحديد خط أنابيب تقريبي. نجح هذا جزئيًا ، ولكن كان بعيدًا عن الفهم في جميع النقاط والأسئلة تظل مفتوحة ، على سبيل المثال ، ما إذا كان يجب بناء الغلاف وعقد العجلة في تسلسل هرمي معين ، وما إذا كانت محاور النقاط موجهة بشكل صحيح ، وما إلى ذلك.

بشكل عام ، ستساعدك هذه التعليمات على فهم المبدأ الأساسي ، ولكن من أجل فهم تعقيدات الإعدادات ، لا يزال عليك دراسة الوثائق (أو ربما سيخبرك بشيء مفيد في التعليقات).

تجميع الاطار


1. إنشاء مشروع جديد. حدد الخيار C #. افتح المشروع في المحرر.







2. نحن نصنع أساس الآلة.

للقيام بذلك ، انقر بزر الماوس الأيمن في المشهد ، واختر إنشاء > بدائي > مربع . والنتيجة كائن مكعبة . ارفعه قليلاً فوق "الأرضية".



3. نصنع عجلات.

انقر بالماوس مرة أخرى وحدد إنشاء > بدائي > أسطوانة . سوف يستغرق 4 قطع.



من أجل عدم الخلط بينه وبين الاتجاه ، يمكنك تدوير الكاميرا بحيث يضيء -Y من الأعلى في المكعب (أي أننا ننظر الآن إلى الجهاز المستقبلي من الخلف) ونضع أسطوانتين خلف Cuboid ، واثنان آخران أمامها. بطريقة ما لتدويرها وتخصيصها ليست ضرورية. للراحة ، يمكن تعيين ألوان مختلفة في الخلف والأمام.

4. إضافة الفيزياء القائمة.

حدد Cuboid وعلى اليسار ، في نافذة Parameters من علامة التبويب العقدة ، قم بالتبديل إلى Physics . في العمود Body ، حدد نوع Rigid . بعد ذلك ، قم بالتمرير لأسفل وحدد عنصر Box في عمود الأشكال المفتوحة .





نرى ShapeBox ظهر. سنذهب إلى إعداداته ونضع قاعدتنا على الفور على الكتلة الموصى بها ( الكتلة ) التي تبلغ 64 كجم.



5. إضافة الفيزياء إلى العجلات.

في المقابل ، حدد الأسطوانات ووضعها أيضًا جامدة في علامة التبويب الفيزياء.
لن يحتاجوا إلى إنشاء شكل ، لأن مفاصل العجلات تعمل على الركعات.

6. اربط العجلات بالقاعدة.

حان الوقت لتعيين مفاصل العجلات. للقيام بذلك ، حدد Cuboid بشكل صحيح وانتقل لأسفل إلى عمود Joints في علامة التبويب Physics . في القائمة ، حدد Wheel وعند النقر فوق الزر Add ، تظهر نافذة Select a Body. هناك تحدد أسطوانة ، ويتم تمييزها بشبكة بيضاء في المشهد ، واضغط على Ok. سيظهر ربط WheelJoint في القائمة . هنا من المستحسن بالفعل إعادة تسميتها (لهذا تحتاج إلى النقر فوق سطر JointWheel وكتابة اسم جديد في عمود الاسم).





بنفس الطريقة ، قم بإرفاق الاسطوانات المتبقية بالمكعبات. حتى أنه في النهاية على قائمة نقاطه أحرق 4 أسطر.


بدون إعادة التسمية سيكون هناك 4 خطوط من WheelJoint.

يرجى ملاحظة أنك بحاجة إلى الربط من Cuboid ، وليس من علامة التبويب Physics في الأسطوانات نفسها. على الرغم من ذلك ، إذا حددت أسطوانة معينة وانتقلت إلى Physics ، فسيتم أيضًا عرض المفصل الذي تم إنشاؤه هناك ويمكنك تحرير معلماته.

7. قم بإعداد تكوين الارتباطات.

مرة أخرى ، حدد Cuboid ، وابحث في الفيزياء قائمة بنقاطها وحدد واحدة منها. نرى أن زاوية بيضاء مع مربعات ظهرت في المشهد داخل Cuboid.
في إعدادات المفصل ، نجد الرسم البياني للمتجه Anchor 0 ، ونضبط قيم الحقول الثلاثة بحيث يتم تغيير هذا الركن على طول المحور X ، خارج Cuboid وينخفض ​​قليلاً على طول المحور Z.





ثم نغير الزاوية على طول المحور Y ، اعتمادًا على الربط العجلة المحددة حاليا.

نكرر الإجراء مع بقية النقاط ، ونحدد نفس التحولات بالضبط على طول Z ونفس الشيء ، ولكن متعدد الاتجاهات على طول المحاور الأخرى.

إذا قمت بتحديد جميع النقاط مرة واحدة ، فسيصبح التصميم العام مرئيًا. يمكنك أيضًا تمكين عرض المفاصل في المساعدين على لوحة خاصة أعلى المشهد: المساعدين> الفيزياء > المفاصل .


منظر خلفي للإطار مع المساعدين المتضمنين

8. ننظر إلى ما حدث.

يوجد في المحرر زر لحساب الفيزياء. إذا قمت بتمكينها ، فستبدأ محاكاة الفيزياء (لا تعمل النصوص البرمجية) ويمكنك التحقق من سلوك فرانكنشتاين.
قبل البدء، تأكد من أن خانات تمكين الاصطدام و الفيزياء تقاطع يتم التحقق في إعدادات "أرضية" . خلاف ذلك ، قد يفشل ابتكارنا تمامًا تحت الأرض تمامًا أو بعجلات فقط.



كن حذرًا ، قبل تشغيل المحاكاة ، من الأفضل الحفظ ، وستعود المعلمات التي تم تصحيحها أثناء تشغيلها إلى قيمها بعد قطع الاتصال.

كما نرى ، يتم التقاط العجلات في الأماكن المناسبة ، ولكن الهيكل يقع على السطح مع نهايات الأسطوانات.



يمكنك تجميد Cuboid نفسه في المكان عن طريق تمكين خانة الاختيار غير المنقولة أولاً في علامة التبويب "الفيزياء" في العمود "الجسم".

9. ضبط محاور العجلات.

تعطيل محاكاة الفيزياء. حدد متوازي المستطيلات، انتقل إلى علامة التبويب الفيزياء وتحرير محاور 00 ، محور 10 و محور 11 لكل تقاطع . يرجى ملاحظة أنه في المجموع ، تأخذ حقول كل متجه قيمًا من 0 إلى 1 وسيحاول المحرر تصحيح القيم تلقائيًا إذا قمت أولاً بوضع 1 في محور جديد بدون صفر المتجه.

على ما يبدو ، لم أقم بعد بتطوير المتجهات بشكل صحيح تمامًا ، ويوضح المساعدون أن الجزأين الأيسر والأيمن ينظران في نفس الاتجاه ، لكنهما لا يعطان فهمًا واضحًا لأي محور هو المكان ، مما يجعل الضبط صعبًا.

على أي حال ، يعمل هذا التخطيط أقل أو أقل. أقوم هنا بتعيين ناقلات المحور على النحو التالي: المحور 00 ( 0 ، 0 ، 1 ) ، المحور 10 ( 1 ، 0 ، 0 ) ، المحور 11 ( 0 ، 0 ، 1 ).



إذا بدأت محاكاة فيزيائية الآن ، فيجب أن يقع التصميم على أسطوانات مستديرة بشكل صحيح ، والتي ستدور لاحقًا على طول المحور الصحيح.

10.كتلة العجلة وسلوكها ، التكرارات الفيزيائية.

على الأرجح ، فشل الهيكل بعد السقوط على الأرض الآن جزئيًا.

أولاً ، دعنا نذهب إلى الإعدادات العامة للفيزياء. نضغط على السطر العلوي من المحرر. Windows > Settings وفي علامة التبويب Settings التي تظهر ، نجد عمود Physics (Runtime / World /). وضعنا 5 على الأقل في مجال التكرارات . مرة أخرى نذهب إلى إعدادات كل مفصل. في أعلى القائمة ، لكل شخص حقل تكرار ، مجموعة 8 . الخطي الرد و الزاوي الرد المقرر أن 0.1 . خطي من






التغيير -0.15 ، خطي إلى 0.15 .
في الجزء السفلي ، نضع عليها كتلة 25 كجم في حقل كتلة العجلة .

عندما تبدأ المحاكاة ، لا يزال يتعين على "الآلة" الفيزيائية أن تفشل / تفشل جزئيًا.

اضبط كل التخميد الخطي على 50 . وضبط الربيع الخطي على 10 .
الآن ، أثناء المحاكاة ، يجب أن يسقط الهيكل ويرتد قليلاً على الأرض. إذا لم يفلح ذلك ، فقم بتجربة قيم التخميد الخطي والربيع الخطي.
توصي الوثائق بوضع التخميد 400 والربيع 100 ، ولكن شخصيًا ، في نفس الوقت ، تبدأ "الآلة" في الدوران مثل طائرة هليكوبتر وترتد وتطير بعيدًا.

11. الإعداد النهائي للإطار.

احفظ وحاول النقر فوق تشغيل (الزر أعلاه ، بجانب تضمين المحاكاة المادية) للتجول في المشهد في الشخص الأول. على الأرجح أن "الآلة" معلقة قليلاً في الهواء ، ولكنها تتدحرج إذا تم دفعها إلى المكعب المركزي.



الآن يمكنك ضبط Anchor 0 عند النقاط بحيث تكون متساوية تقريبًا من المركز (على الرغم من أنها ليست ضرورية). ثم ابدأ المحاكاة وتغيير الزنبرك الخطي مباشرة خلالها للعثور على القيمة المثلى التي تلامس فيها كل عجلة الأرض.

بعد كل هذه التلاعبات ، يجب أن تحصل على "آلة" تسقط على الأرض بشكل صحيح ، والتي تدور بشكل طفيف عند الدفع في وضع اللعبة ، حيث تعمل افتراضيًا على وحدة تحكم منفصلة مع عرض من منظور الشخص الأول.



كتابة سيناريو التحكم



لدينا فراغ من "الآلة الكاتبة" ، الآن سنكتب رمز تحكم لها في C #.
للقيام بذلك ، انقر بزر الماوس الأيمن في النافذة أسفل المشهد وحدد إنشاء > إنشاء مكون C # . أدخل اسم البرنامج النصي في النافذة التي تظهر.





انقر نقرًا مزدوجًا فوق ملف البرنامج النصي الظاهر وتبدأ بيئة التطوير.



حدد الخطوط المليئة باللون الأزرق في الصورة ، واحذفها وبدلاً من ذلك أضف التعليمات البرمجية التالية التي خرجت إليها لتحرير النص المقترح في الوثائق:

مقتطف البرنامج النصي
	[ShowInEditor][Parameter(Tooltip = "Left Wheel")]
	private Node targetWheelL = null;
	[ShowInEditor][Parameter(Tooltip = "Right Wheel")]
	private Node targetWheelR = null;

	[ShowInEditor][Parameter(Tooltip = "Left Wheel F")]
	private Node targetFWL = null;
	[ShowInEditor][Parameter(Tooltip = "Right Wheel F")]
	private Node targetFWR = null;

	[ShowInEditor][Parameter(Tooltip = "theCar")]
	private Node targetCar = null;

    private JointWheel my_jointL;
    private JointWheel my_jointR;
    private JointWheel my_jointFL;
    private JointWheel my_jointFR;

	Controls controls = null;
	float angle = 0.0f;
	float velocity = 0.0f;
	float torque = 0.0f;

	private float ifps;

	private void Init()
	{
	my_jointL = targetWheelL.ObjectBodyRigid.GetJoint(0) as JointWheel;
	my_jointR = targetWheelR.ObjectBodyRigid.GetJoint(0) as JointWheel;
	my_jointFL = targetFWL.ObjectBodyRigid.GetJoint(0) as JointWheel;
	my_jointFR = targetFWR.ObjectBodyRigid.GetJoint(0) as JointWheel;

	PlayerPersecutor player = new PlayerPersecutor();
	controls = player.Controls;
	}
	
	private void Update()
	{
			ifps = Game.IFps;

			if ((controls.GetState(Controls.STATE_FORWARD) == 1) || (controls.GetState(Controls.STATE_TURN_UP) == 1))
			{
				velocity = MathLib.Max(velocity, 0.0f);
				velocity += ifps * 50.0f;
				torque = 5.0f;
			}
			else if ((controls.GetState(Controls.STATE_BACKWARD) == 1) || (controls.GetState(Controls.STATE_TURN_DOWN) == 1))
			{
				velocity = MathLib.Min(velocity, 0.0f);
				velocity -= ifps * 50.0f;
				torque = 5.0f;
			}
			else
			{
				velocity *= MathLib.Exp(-ifps);
			}
			velocity = MathLib.Clamp(velocity, -90.0f, 90.0f);

			if ((controls.GetState(Controls.STATE_MOVE_LEFT) == 1) || (controls.GetState(Controls.STATE_TURN_LEFT) == 1))
				angle += ifps * 100.0f;
			else if ((controls.GetState(Controls.STATE_MOVE_RIGHT) == 1) || (controls.GetState(Controls.STATE_TURN_RIGHT) == 1))
				angle -= ifps * 100.0f;
			else
			{
				if (MathLib.Abs(angle) < 0.25f) angle = 0.0f;
				else angle -= MathLib.Sign(angle) * ifps * 45.0f;
			}
	
			angle = MathLib.Clamp(angle, -10.0f, 10.0f);

			float base_a = 3.3f;
			float width = 3.0f;
			float angle_0 = angle;
			float angle_1 = angle;
			if (MathLib.Abs(angle) > MathLib.EPSILON)
			{
				float radius = base_a / MathLib.Tan(angle * MathLib.DEG2RAD);
				angle_0 = MathLib.Atan(base_a / (radius + width / 2.0f)) * MathLib.RAD2DEG;
				angle_1 = MathLib.Atan(base_a / (radius - width / 2.0f)) * MathLib.RAD2DEG;
			}

			my_jointFL.Axis10 = MathLib.RotateZ(angle_0).GetColumn3(0);
			my_jointFR.Axis10 = MathLib.RotateZ(angle_1).GetColumn3(0);

			if (controls.GetState(Controls.STATE_USE) == 1)
			{
				velocity = 0.0f;
					my_jointL.AngularDamping = 20000.0f;
					my_jointR.AngularDamping = 20000.0f;
					my_jointFL.AngularDamping = 20000.0f;
					my_jointFR.AngularDamping = 20000.0f;
			}
			else
			{
					my_jointL.AngularDamping = 0.0f;
					my_jointR.AngularDamping = 0.0f;
					my_jointFL.AngularDamping = 0.0f;
					my_jointFR.AngularDamping = 0.0f;
			}

			if (Input.IsKeyDown(Input.KEY.Q))
			{
				targetCar.ObjectBodyRigid.AddLinearImpulse(vec3.UP*1000f);
			}
			if (Input.IsKeyDown(Input.KEY.E))
			{
				targetCar.ObjectBodyRigid.AddLinearImpulse(vec3.DOWN*1000f);
			}

	}

		private void UpdatePhysics()
		{
			my_jointL.AngularVelocity = velocity;
			my_jointR.AngularVelocity = velocity;
			
			my_jointL.AngularTorque = torque;
			my_jointR.AngularTorque = torque;
		}



:

TheVehicle.cs
using System;
using System.Collections;
using System.Collections.Generic;
using Unigine;

[Component(PropertyGuid = "ca695c8787d5703a22a6c2516a3c177cddf38cab")]
public class TheVehicle : Component
{

, , . , .

[ShowInEditor][Parameter(Tooltip = "Left Wheel")]
private Node targetWheelL = null;
[ShowInEditor][Parameter(Tooltip = "Right Wheel")]
private Node targetWheelR = null;

[ShowInEditor][Parameter(Tooltip = "Left Wheel F")]
private Node targetFWL = null;
[ShowInEditor][Parameter(Tooltip = "Right Wheel F")]
private Node targetFWR = null;

[ShowInEditor][Parameter(Tooltip = "theCar")]
private Node targetCar = null;

. tooltip , .

private JointWheel my_jointL;
private JointWheel my_jointR;
private JointWheel my_jointFL;
private JointWheel my_jointFR;

.

Controls controls = null;

float angle = 0.0f;
float velocity = 0.0f;
float torque = 0.0f;

private float ifps;

.

private void Init()
{
my_jointL = targetWheelL.ObjectBodyRigid.GetJoint(0) as JointWheel;
my_jointR = targetWheelR.ObjectBodyRigid.GetJoint(0) as JointWheel;
my_jointFL = targetFWL.ObjectBodyRigid.GetJoint(0) as JointWheel;
my_jointFR = targetFWR.ObjectBodyRigid.GetJoint(0) as JointWheel;

, JointWheel.
, , ( ).

			
// setting up player and controls
PlayerPersecutor player = new PlayerPersecutor();
controls = player.Controls;
}

, PlayerPresecutor, Controls player .

private void Update()
{
ifps = Game.IFps;

// forward and backward movement by setting joint motor's velocity and torque
			if ((controls.GetState(Controls.STATE_FORWARD) == 1) || (controls.GetState(Controls.STATE_TURN_UP) == 1))
			{
				velocity = MathLib.Max(velocity, 0.0f);
				velocity += ifps * 50.0f;
				torque = 5.0f;
			}//Input.IsKeyDown(Input.KEY.DOWN)
			else if ((controls.GetState(Controls.STATE_BACKWARD) == 1) || (controls.GetState(Controls.STATE_TURN_DOWN) == 1))
			{
				velocity = MathLib.Min(velocity, 0.0f);
				velocity -= ifps * 50.0f;
				torque = 5.0f;
			}
			else
			{
				velocity *= MathLib.Exp(-ifps);
			}
			velocity = MathLib.Clamp(velocity, -90.0f, 90.0f);

			// steering left and right by changing Axis01 for front wheel joints
			if ((controls.GetState(Controls.STATE_MOVE_LEFT) == 1) || (controls.GetState(Controls.STATE_TURN_LEFT) == 1))
				angle += ifps * 100.0f;
			else if ((controls.GetState(Controls.STATE_MOVE_RIGHT) == 1) || (controls.GetState(Controls.STATE_TURN_RIGHT) == 1))
				angle -= ifps * 100.0f;
			else
			{
				if (MathLib.Abs(angle) < 0.25f) angle = 0.0f;
				else angle -= MathLib.Sign(angle) * ifps * 45.0f;
			}

			angle = MathLib.Clamp(angle, -10.0f, 10.0f);//      30  (angle, -30.0f, 30.0f)

			// calculating steering angles for front joints (angle_0 and angle_1)
			float base_a = 3.3f;
			float width = 3.0f;
			float angle_0 = angle;
			float angle_1 = angle;
			if (MathLib.Abs(angle) > MathLib.EPSILON)
			{
				float radius = base_a / MathLib.Tan(angle * MathLib.DEG2RAD);
				angle_0 = MathLib.Atan(base_a / (radius + width / 2.0f)) * MathLib.RAD2DEG;
				angle_1 = MathLib.Atan(base_a / (radius - width / 2.0f)) * MathLib.RAD2DEG;
			}

Update, , .

my_jointFL.Axis10 = MathLib.RotateZ(angle_0).GetColumn3(0);
my_jointFR.Axis10 = MathLib.RotateZ(angle_1).GetColumn3(0);

// enabling or disabling a brake
if (controls.GetState(Controls.STATE_USE) == 1)
{
velocity = 0.0f;
my_jointL.AngularDamping = 20000.0f;
my_jointR.AngularDamping = 20000.0f;
my_jointFL.AngularDamping = 20000.0f;
my_jointFR.AngularDamping = 20000.0f;
}
else
{
my_jointL.AngularDamping = 0.0f;
my_jointR.AngularDamping = 0.0f;
my_jointFL.AngularDamping = 0.0f;
my_jointFR.AngularDamping = 0.0f;
}

, , . , 4 . , , 10 .

if (Input.IsKeyDown(Input.KEY.Q))
{
targetCar.ObjectBodyRigid.AddLinearImpulse(vec3.UP*1000f);
}

if (Input.IsKeyDown(Input.KEY.E))
{
targetCar.ObjectBodyRigid.AddLinearImpulse(vec3.DOWN*1000f);
}

}

Update , . , — «this.» .

private void UpdatePhysics()
{
// set angular velocity for rear joints
my_jointL.AngularVelocity = velocity;
my_jointR.AngularVelocity = velocity;

// set torque for rear joints
my_jointL.AngularTorque = torque;
my_jointR.AngularTorque = torque;

}

}

Update Physics , velocity torque.


بعد ذلك ، احفظ ملف البرنامج النصي وارجع إلى نافذة المحرر. سيتحقق Unigine من وجود أخطاء في البرنامج ، وإذا كان كل شيء على ما يرام ، فيجب أن يظهر مستطيل أخضر في أسفل اليمين مع نجاح إنشاء مشروع الإخطار.

الآن حدد Cuboid ، أضف حقل المكون إليه واسحب نصنا هناك. تظهر بعض الحقول التي يجب ملؤها. في الحقل Target Wheel L ، اسحب العجلة الخلفية اليسرى برفق (أي تشير الأسطوانة إليها) ، و Target Whell R - العجلة الخلفية اليمنى ، و Target FWL - الأمامي الأيسر ، و Target FWR - الأمامي الأيمن ، و Cuboid نفسها في مجال Target Car.


لإضافة مكوِّن ، نجد هذا الحقل في خصائص المكعبة وننقر عليه.


سيظهر سطر فارغ حيث يمكنك سحب ملف البرنامج النصي (أو البحث عن المسار إليه من خلال أيقونة المجلد)


املأ الحقول

Run Play - الآن بدأت الآلة في التحرك. صحيح ، بالتزامن مع الشخصية التي تنظر إليها الآن نيابة عن العالم.

تحكمها كما يلي: W - تتحرك للأمام ، S - للخلف ، A و D - أدر العجلات الأمامية لليسار واليمين ، على التوالي. تم إعطاء دفعة إلى Q ، حيث كانت الآلة تقفز. على E ، على العكس من ذلك، ينتقل دفعة إلى أسفل.

قد تلاحظ أن الجهاز يسقط ببطء طفيف ، مثل القمر. لتحسين هذه اللحظة هناك خياران. اقترحت الوثائق إجراء تغييرات على ملف AppWorldLogic.cs. لكننا لسنا بحاجة إلى ذلك ، لأنني أجريت التهيئة هناك في برنامج الآلة الكاتبة. باستثناء بعض الأسطر التي تحكم الفيزياء العالمية.

والحقيقة هي أنه يمكنك إدخال هذه الإعدادات بشكل مستقل وتغييرها. للقيام بذلك ، انقر فوق السطر العلوي من المحرر. Windows> Settings ، في النافذة التي تفتح ، ابحث عن العمود Physics وقم بتعيين القيمة لـ Frozen Linear Velocity إلى 0.1 ، وبالنسبة لـ Frozen Angular Velocity أيضًا 0.1 ، وقم بتغيير أقل متجه للجاذبية من (0،0 ، -9،8) إلى (0،0 ، - 19.6).

يمكن فعل الشيء نفسه في التعليمات البرمجية عن طريق إضافة الأسطر التالية إلى الحرف الأولي:

Physics.Gravity = new vec3(0.0f, 0.0f, -9.8f * 2.0f);
Physics.FrozenLinearVelocity = 0.1f;
Physics.FrozenAngularVelocity = 0.1f;

إذا بدأت تشغيل Play الآن ، فمن المحتمل أن تتدهور "الآلة" مرة أخرى وتبدأ في الفشل. لإصلاح ذلك ، حاول تدوير زنبرك خطي في كل عجلة. رفع مرتين لبداية. عند الإعداد ، ستلاحظ أن الجاذبية أثناء القفزات أقوى (على الرغم من أنني قمت بتعيين زخم القفز إلى مرتفع جدًا بشكل افتراضي).

الآن بعد أن أصبحت مبتلًا بالفعل أثناء إعداد هذه العربة المزاجية ، حان الوقت لإسقاط أغلال firts_person_controller وإلقاء نظرة على ما يحدث من جانب الجهاز نفسه ، باستخدام كاميرا من منظور شخص ثالث.
تم تنزيل تعطيل first_person_controller (انقر فوق المربع الموجود بجوار اسمه حتى يصبح فارغًا).
اصنع كاميرا. للقيام بذلك ، انقر بزر الماوس الأيمن على المشهد وحدد إنشاء> كاميرا> مقدّم. ستظهر كاميرا PlayerPresecutor نفسها وستظهر هدفها الوهمي Presecutor_Target.
يمكن إيقاف الدمية. نضغط على الكاميرا نفسها ، وتأكد من تحديد مربع الاختيار Main Player في خصائصها (حتى لا تحصل على شاشة سوداء عند بدء التشغيل). في حقل العقدة الهدف نجد المكعبة في القائمة المنسدلة.

حفظ وانقر فوق تشغيل.

الآن يمكنك الركوب بالكامل. صحيح أن الكاميرا يمكن أن تطير بعيدًا. لإصلاح ذلك ، تحتاج إلى ضبط حدوده. نعود إلى المحرر ونضع خصائص الكاميرا ، على سبيل المثال ، Min Distance 10 و Max Distance 30.

Neungers في محرك Unigine


بعد أن تعلمت جمع فيزياء العجلة التقريبية ، قمت بعمل مشهد اختباري باستخدام نموذج bio-mechos من مشروع نيفانجر الخاص بي. إليك ما يبدو عليه الآن:



لقطات الشاشة







المشاكل الرئيسية في الوقت الحالي هي بعض عدم الاستقرار في التصميم. وهذا مرة أخرى يرجع إلى حقيقة أنني لم أفهم بعد جميع جوانب الفروق الدقيقة والفروق الدقيقة في الإعدادات. في بعض الأحيان يتعثر الجهاز حول شيء ما ويبدأ في التدوير بشراسة. لا يبدو أن تقليل التخميد الخطي يساعد كثيرًا ، فيلتوي المعلمات الأخرى أيضًا ، على الرغم من أنني لم أقم بلف شيء أو تكوينه حتى الآن ، ولكنه ليس شاملاً.

خلل آخر - هناك حالات عالقة تمامًا في الأرض ، عندما تلتصق العجلات الأمامية ، والخلف تحت المناظر الطبيعية. أو تخترق المناظر الطبيعية نفسها بسرعة عالية ، ويتبعها التحليق تحتها. كل هذا ، على ما يبدو ، يتم تصحيحه عن طريق تعيين التسامح والتكرار ، ولكن حتى الآن لم يتم العثور على القيم المثلى.

بشكل عام ، على سطح مستوٍ إلى حد ما ، تكون الحركة أكثر ملاءمة بالفعل. ليس من الواضح مدى حسن تصرف مفاصل العجلة على سطح غير مستوٍ بشكل مثالي ، كما فهمت في عروض الفيديو للمحرك للسيارات التي استخدموها قديمة (على ما يبدو) ، ولكن مفاصل التعليق "الأكثر صدقًا" جسديًا (بالمناسبة ، لم أحاول تجميع آلة عليها ، ربما ، كل شيء أسهل إلى حد ما هناك). تأخذ Do Wheel المفاصل في الاعتبار معلمات الاحتكاك للمناظر الطبيعية ، أو أنها مهتمة فقط بما إذا كان علم الفيزياء قيد التشغيل.

الانطباعات العامة للمحرك


بالنسبة للعمل مع المحرر ، ذكرني أكثر ما حدث بعملية العمل مع CryEngine. على الرغم من أنه في بعض الأماكن يكون أكثر ملاءمة. لكن الأمر يشبه شخصًا ما ، في نفس CryEngine كان من الممكن تصميم النموذج مباشرة في المحرر. هذا ليس مناسبًا بالنسبة لي ، لأنني أستخدم Blender ، حيث لديك أوامر بحجم أكبر لمزيد من التحكم في النموذج ، وقد يكون ذلك مهمًا بالنسبة لشخص ما.

في الصورة أدناه ، تظهر قائمة بالمواد على اليسار. يتم طلاء الشبكات من خلال مجموعة من المواد القائمة على الشبكة ، والتي يمكنك من خلالها استنساخ خيارات المواد الخاصة بك. يعد طلاء الأراضي ذات الملمس أكثر صعوبة بالفعل ، ولكن يتم استخدام الأقنعة بالكامل - يمكنك مزج القوام وخرائط الارتفاع وما إلى ذلك ، إذا كنت تفهم الجهاز. لنفس الماء ، هناك مجموعة منفصلة من المواد الخاصة بها ، تتم إضافتها حرفياً بنقرة واحدة وتبدو جيدة جدًا.

على اليمين يوجد التسلسل الهرمي لكائنات المشهد ونافذة الخصائص. من غير اللائق التعامل مع القيم العددية أثناء الطيران - تحتاج إلى الدخول إلى الرمز بسهام صغيرة. تكون بعض أشرطة التمرير مضللة في البداية ، لأنها لا تعرض النطاق الكامل للمعلمة ، ولكن لنفترض ، على سبيل المثال ، الفاصل الزمني من 0 إلى 1. يتم تنظيم سرعة طيران الكاميرا في الميدان مع وجود رجل يعمل في الأعلى ، افتراضيًا يتحرك ببطء إلى حد ما ، بناءً على الأحاسيس . ربما يكون هذا أكثر ملاءمة عند العمل مع النماذج على نطاق حقيقي.


All Articles