Bagaimana Saya Mengumpulkan Fisika Roda di Unigine

Selamat siang.

Kali ini kita akan berbicara tentang mesin Unigine Rusia , dan bagaimana cara merakit mesin sederhana di dalamnya. Skema ini tidak ideal, karena saya belum menemukan jawabannya dalam beberapa hal, tetapi setidaknya saya akan membagikan pengalaman saya.



Pertama-tama, untuk memahami bagaimana fisika roda dilakukan, kita pergi ke dokumentasi resmi dan menemukan contoh ini .

Ngomong-ngomong, perhatikan bahwa ini adalah contoh untuk sambungan roda, tetapi karena alasan tertentu ia terletak di alamat / car_suspension_joints /. Anda juga perlu memastikan bahwa dokumentasi tidak melompat ke versi lama (yaitu, bahwa DOCS (2.11) terbuka) dan tandai kotak "C #" di atas artikel.

Setelah mempelajari contoh, kita melihat bahwa itu ditulis dengan analogi dengan solusi C ++ awal. Artinya, semuanya dibuat melalui kode. Begitu banyak untuk pemrograman visual, kami telah tiba. Ya, tidak semuanya sedih, tetapi Anda bisa melihat bagaimana semua ini dilakukan dalam kode. Dan setelah berjalan di tautan, dapatkan gagasan umum tentang perangkat sambungan roda dan pengaturan fisika.
( ). , -, UnigineScript, . LOD'.
Tentu saja, saya mengharapkan panduan langkah-demi-langkah yang sudah jadi tentang perakitan visual untuk mendapatkan sesuatu yang bergulir, dengan biaya sedikit darah. Akibatnya, saya masih harus menceburkan semuanya dengan kepala saya untuk menyelesaikan beberapa perkiraan pipa. Ini sebagian berhasil, tetapi masih jauh dari dipahami di semua titik dan pertanyaan tetap terbuka, misalnya, apakah casing dan roda node harus dibangun ke dalam hierarki tertentu, apakah sumbu titik berorientasi dengan benar, dan sebagainya.

Secara umum, instruksi ini akan membantu Anda memahami prinsip dasar, tetapi untuk memahami seluk-beluk pengaturan, Anda masih harus mempelajari dokumentasi (atau mungkin mereka akan memberi tahu Anda sesuatu yang berguna dalam komentar).

Perakitan bingkai


1. Buat proyek baru. Pilih opsi C #. Buka proyek di editor.







2. Kami menciptakan dasar mesin.

Untuk melakukan ini, klik kanan di tempat kejadian, pilih Buat > Primitif > Kotak . Hasilnya adalah objek berbentuk kubus . Angkat sedikit di atas "lantai".



3. Kami membuat roda.

Klik lagi mouse dan pilih Buat > Primitif > Silinder . Ini akan memakan waktu 4 buah.



Agar tidak bingung dengan orientasi, Anda dapat memutar kamera sehingga -Y bersinar dari atas dalam kubus (yaitu, kita sekarang melihat mesin masa depan dari belakang) dan menempatkan dua silinder di belakang Cuboid, dua lainnya di depannya. Entah bagaimana untuk memutar dan menyesuaikannya tidak perlu. Untuk kenyamanan, warna berbeda dapat ditetapkan ke belakang dan depan.

4. Tambahkan berbasis fisika.

Pilih berbentuk kubus dan di sebelah kiri, di jendela Parameter dari tab Node , beralih ke Fisika . Di kolom Tubuh, pilih tipe Kaku . Setelah itu, gulir ke bawah dan pilih item Kotak di kolom Bentuk yang dibuka .





Kami melihat ShapeBox yang muncul. Kami akan masuk ke pengaturannya dan segera mengatur basis kami ke massa yang disarankan ( Mass ) 64 kilogram.



5. Tambahkan fisika ke roda.

Pada gilirannya, pilih silinder dan juga letakkan kaku di tab Fisika.
Mereka tidak perlu membuat Shape, karena sambungan roda bekerja pada rakcast.

6. Ikat roda ke alas.

Waktu untuk menetapkan sambungan roda. Untuk melakukan ini, pilih berbentuk kubus dengan benar dan gulir ke bawah ke kolom sendi di tab Fisika . Dalam daftar, pilih Wheel dan ketika Anda klik Add tombol, Pilih Tubuh jendela muncul. Di sana Anda memilih silinder, itu disorot dengan kotak putih di tempat kejadian, dan tekan Ok. Ikatan WheelJoint akan muncul dalam daftar . Di sini sudah diinginkan untuk mengubah nama mereka (untuk ini Anda perlu mengklik pada baris JointWheel dan menulis nama baru di kolom Nama).





Dengan cara yang sama, pasang silinder yang tersisa ke berbentuk kubus. Sehingga pada akhirnya daftar poinnya membakar 4 baris.


Tanpa mengganti nama, akan ada 4 baris WheelJoint.

Harap dicatat bahwa Anda harus mengikat dari Cuboid, dan bukan dari tab Fisika dari silinder itu sendiri. Meskipun setelah itu, jika Anda memilih silinder tertentu dan pergi ke Fisika, maka sambungan yang dibuat juga ditampilkan di sana dan Anda dapat mengedit parameternya.

7. Atur konfigurasi binding.

Sekali lagi, pilih berbentuk kubus, temukan dalam Fisika daftar poinnya dan pilih salah satunya. Kita melihat bahwa sudut putih dengan kotak muncul dalam adegan di dalam Cuboid.
Dalam pengaturan sambungan, kami menemukan grafik vektor Jangkar 0 , dan menyesuaikan nilai tiga bidangnya sehingga sudut ini bergeser di sepanjang sumbu X, di luar Cuboid dan sedikit diturunkan di sepanjang sumbu Z.





Kemudian kami menggeser sudut di sepanjang sumbu Y, tergantung pada pengikatan roda mana yang saat ini dipilih.

Kami mengulangi prosedur dengan sisa poin, mengatur pergeseran yang sama persis di sepanjang Z dan yang sama, tetapi multidirectional di sepanjang sumbu lainnya.

Jika Anda memilih semua titik sekaligus, keseluruhan desain akan terlihat. Anda juga dapat mengaktifkan tampilan sambungan dalam bantuan pada panel khusus di atas layar: Pembantu> Fisika > Persendian .


Tampak belakang frame dengan pembantu yang disertakan

8. Kami melihat apa yang terjadi.

Di editor ada tombol untuk menghitung fisika. Jika Anda mengaktifkannya, maka simulasi fisika dimulai (skrip tidak berfungsi) dan Anda dapat memeriksa bagaimana perilaku Frankenstein kami.
Sebelum memulai, pastikan bahwa kotak centang yang diaktifkan untuk Tabrakan dan Persimpangan Fisika diperiksa dalam pengaturan "lantai" . Jika tidak, kreasi kami mungkin sepenuhnya gagal total di bawah lantai atau hanya dengan roda.



Hati-hati, sebelum menyalakan simulasi, lebih baik menyimpan, dan parameter yang dikoreksi selama operasinya akan kembali ke nilainya setelah diputuskan.

Seperti yang kita lihat, roda diambil di tempat yang tepat, tetapi struktur jatuh di permukaan dengan ujung-ujung silinder.



Anda dapat membekukan Cuboid sendiri dengan terlebih dahulu mengaktifkan kotak centang Immovable pada tab Fisika di kolom Tubuh.

9. Sesuaikan as roda.

Nonaktifkan simulasi fisika. Pilih berbentuk kubus, buka tab Fisika dan edit sumbu 00 , Axis 10 dan Axis 11 untuk setiap persimpangan . Harap perhatikan bahwa dalam penjumlahan, bidang dari masing-masing vektor mengambil nilai dari 0 hingga 1 dan editor akan mencoba untuk mengoreksi nilai secara otomatis jika Anda pertama-tama memasukkan 1 pada sumbu baru tanpa memusatkan perhatian pada vektor.

Rupanya, saya belum mengembangkan vektor dengan benar, para pembantu menunjukkan bahwa bagian kiri dan kanan melihat ke arah yang sama, tetapi mereka tidak memberikan pemahaman yang jelas tentang sumbu mana, yang membuat penyetelan sulit.

Bagaimanapun, tata letak ini kurang atau kurang berfungsi. Di sini saya mengatur vektor sumbu sebagai berikut: Sumbu 00 ( 0 , 0 , 1 ), Sumbu 10 ( 1 , 0 , 0 ), Sumbu 11 ( 0 , 0 , 1 ).



Jika Anda memulai simulasi fisika sekarang, maka desain harus jatuh pada silinder yang diputar dengan benar, yang selanjutnya akan berputar di sepanjang sumbu yang benar.

10.Massa roda dan perilaku, iterasi fisik.

Kemungkinan besar, struktur setelah jatuh ke lantai sekarang sebagian gagal.

Pertama, mari kita masuk ke pengaturan umum fisika. Kami klik pada baris atas editor. Windows > Pengaturan dan di tab Pengaturan yang terbuka, kami menemukan kolom Fisika (Runtime / Dunia /). Kami menetapkan setidaknya 5 di bidang Iterasi . Sekali lagi kita masuk ke pengaturan masing-masing sendi. Di bagian atas daftar, setiap orang memiliki bidang Iterasi , set 8 . Restitusi Linier dan Restitusi Sudut diatur ke 0,1 . Linier dari






ubah -0,15 , Linear Ke menjadi 0,15 .
Di bagian bawah kami membubuhkan mereka massa 25 kg di bidang Roda Massa .

Ketika simulasi dimulai, "mesin" fisika masih harus sebagian gagal / gagal.

Atur setiap Redaman Linear menjadi 50 . Dan atur Linear Spring ke 10 .
Sekarang, selama simulasi, struktur harus jatuh dan memantul sedikit di lantai. Jika itu tidak berhasil, maka bereksperimenlah dengan nilai Linear Damping dan Linear Spring.
Dokumentasi merekomendasikan pengaturan redaman 400 dan pegas 100, tetapi secara pribadi, pada saat yang sama, "mesin" mulai berputar seperti helikopter, memantul dan terbang.

11. Pengaturan akhir frame.

Simpan dan coba klik Mainkan (tombol di atas, di sebelah penyertaan simulasi fisik) untuk berjalan di sekitar adegan pada orang pertama. Kemungkinan besar "mesin" menggantung sedikit di udara, tetapi berguling jika didorong ke dalam kubus pusat.



Sekarang Anda dapat menyesuaikan Anchor 0 pada titik-titik sehingga mereka kira-kira berjarak sama dari pusat (walaupun tidak perlu). Kemudian mulai simulasi dan ubah Linear Spring tepat selama itu untuk menemukan nilai optimal di mana setiap roda menyentuh tanah secara normal.

Setelah semua manipulasi ini, Anda harus mendapatkan "mesin" dengan benar jatuh ke lantai, yang berguling sedikit ketika mendorong dalam mode permainan, di mana secara default Anda menjalankan pada pengontrol terpisah dengan tampilan orang pertama.



Menulis skrip kontrol



Kami memiliki blank untuk "mesin tik," sekarang kami akan menulis padanya kode kontrol di C #.
Untuk melakukan ini, klik kanan pada jendela di bawah layar dan pilih Buat > Buat Komponen C # . Masukkan nama skrip di jendela yang muncul.





Klik dua kali pada file skrip yang muncul dan lingkungan pengembangan dimulai.



Pilih garis-garis yang diisi dengan warna biru di gambar, hapuslah dan tambahkan kode berikut yang saya gunakan untuk mengedit skrip yang diajukan dalam dokumentasi:

Cuplikan skrip
	[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.


Setelah itu, simpan file skrip dan kembali ke jendela editor. Unigine akan memeriksa kesalahan program, dan jika semuanya baik-baik saja, maka persegi panjang hijau akan muncul di kanan bawah dengan pemberitahuan membangun Proyek berhasil.

Sekarang pilih Cuboid, tambahkan bidang komponen ke dalamnya dan seret skrip kami ke sana. Muncul beberapa bidang yang perlu diisi. Di bidang Target Wheel L, seret perlahan roda belakang kiri (yaitu, Cylinder yang menunjukkannya), Target Whell R - roda belakang kanan, Target FWL - kiri depan, Target FWR - kanan depan, dan Cuboid itu sendiri di bidang Target Car.


Untuk menambahkan komponen, kami menemukan bidang seperti itu di properti berbentuk kubus dan klik di atasnya.


Baris kosong akan muncul di mana Anda dapat menyeret file skrip (atau menemukan path ke sana melalui ikon folder)


Isi kolom

Run Play - sekarang mesin mulai bergerak. Benar, bersamaan dengan karakter yang mewakili Anda sekarang memandang dunia.

Kontrolnya adalah sebagai berikut: W - menggulung ke depan, S - mundur, A dan D - memutar roda depan ke kiri dan kanan, masing-masing. Sebuah impuls diberikan sampai dengan Q , mesin, karena itu, melompat. Pada E , sebaliknya, impuls bergerak ke bawah.

Anda mungkin memperhatikan bahwa mesin jatuh sedikit lambat, seperti di bulan. Untuk meningkatkan momen ini ada dua opsi. Dokumentasi menyarankan untuk membuat perubahan pada file AppWorldLogic.cs. Tapi kami tidak membutuhkan ini, karena saya melakukan inisialisasi di sana dalam skrip mesin tik. Kecuali beberapa baris yang mengatur fisika global.

Faktanya adalah bahwa Anda dapat secara mandiri memasukkan pengaturan ini dan mengubahnya. Untuk melakukan ini, klik pada baris atas editor. Windows> Pengaturan, di jendela yang terbuka, temukan kolom Fisika dan tetapkan nilai untuk Kecepatan Beku Linear menjadi 0,1, untuk Kecepatan Sudut Beku juga 0,1, dan ubah vektor Gravitasi terendah dari (0,0, -9,8) menjadi (0,0, - 19.6).

Hal yang sama dapat dilakukan dalam kode dengan menambahkan baris berikut ke Init:

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

Jika Anda mulai Mainkan sekarang, maka "mesin" mungkin akan memburuk lagi dan mulai gagal. Untuk memperbaiki ini, coba putar Pegas Linear di setiap roda. Angkat dua kali untuk memulai. Ketika Anda mengatur, Anda akan melihat bahwa gravitasi selama lompatan lebih kuat (meskipun saya mengatur momentum lompat ke cukup tinggi secara default).

Sekarang Anda sudah basah saat menyiapkan gerobak murung ini, saatnya untuk melepaskan belenggu firts_person_controller dan melihat apa yang terjadi dari sisi mesin itu sendiri, dengan kamera orang ketiga.
Nonaktifkan first_person_controller diunduh (klik kotak di sebelah namanya sehingga menjadi kosong).
Buat kamera. Untuk melakukan ini, klik kanan pada tempat kejadian dan pilih Buat> Kamera> Presecutor. Kamera PlayerPresecutor itu sendiri dan target dummy, Presecutor_Target akan muncul.
Boneka itu bisa dimatikan. Kami mengklik kamera itu sendiri, pastikan untuk memeriksa kotak centang Main Player di propertinya (agar tidak mendapatkan layar hitam saat startup). Di bidang Target Node kami menemukan Cuboid kami di daftar turun bawah.

Simpan dan klik Mainkan.

Sekarang Anda dapat sepenuhnya naik. Benar, kameranya bisa terbang cukup jauh. Untuk memperbaikinya, Anda perlu menyesuaikan batasnya. Kami kembali ke editor dan mengatur dalam properti kamera, misalnya, Min Distance 10 dan Max Distance 30.

Neungers di mesin Unigine


Setelah belajar mengumpulkan perkiraan fisika roda, saya membuat adegan uji dengan model bio-mechos dari proyek Nevanger saya. Begini tampilannya saat ini:



Tangkapan layar







Masalah utama saat ini adalah beberapa ketidakstabilan desain. Yang lagi karena fakta bahwa saya belum sepenuhnya memahami semua aspek dan nuansa pengaturan. Terkadang mesin tersandung tentang sesuatu dan mulai berputar dengan ganas. Mengurangi Linear Damping sepertinya tidak banyak membantu, memelintir parameter lain juga, meskipun saya belum memelintir atau mengkonfigurasi sesuatu, tetapi itu tidak komprehensif.

Bug lain - ada situasi dengan total macet di lantai, ketika roda depan menempel ke atas, dan bagian belakang di bawah lanskap. Atau menabrak lanskap itu sendiri dengan kecepatan tinggi, diikuti dengan terbang jauh di bawahnya. Semua ini, tampaknya, dikoreksi dengan menetapkan toleransi dan iterasi, tetapi sejauh ini belum menemukan nilai optimal.

Secara umum, pada permukaan yang cukup rata, gerakannya sudah lebih memadai. Tidak jelas seberapa baik Wheel Joints berperilaku pada permukaan yang tidak rata idealnya, seperti yang saya pahami dalam demo video mesin untuk mobil yang mereka gunakan ketinggalan jaman (tampaknya), tetapi secara fisik "jujur" Suspension Sendi (omong-omong, saya tidak mencoba untuk merakit mesin pada mereka, mungkin , semuanya agak lebih mudah di sana). Apakah Sambungan Roda memperhitungkan parameter gesekan lanskap, atau mereka hanya tertarik pada apakah bendera fisika dihidupkan.

Kesan umum dari mesin


Sedangkan untuk bekerja dengan editor, apa yang terjadi paling mengingatkan saya pada proses bekerja dengan CryEngine. Meskipun di beberapa tempat itu lebih nyaman. Tapi itu seperti seseorang, di CryEngine yang sama dimungkinkan untuk memodel langsung di editor. Ini tidak relevan bagi saya, karena untuk ini saya menggunakan Blender, di mana Anda memiliki pesanan lebih besar kontrol atas model, dan bagi seseorang itu mungkin penting.

Pada gambar di bawah ini, daftar material terlihat di sebelah kiri. Jaring dicat melalui sekelompok bahan berbasis jala, dari mana Anda dapat mengkloning opsi materi Anda. Untuk melukis terrane dengan tekstur sudah lebih sulit, tetapi masker digunakan secara penuh - Anda dapat mencampur tekstur, peta ketinggian, dan sebagainya, jika Anda memahami perangkat. Untuk air yang sama, ada kelompok bahan yang terpisah, ditambahkan secara harfiah dalam satu klik dan terlihat cukup bagus.

Di sebelah kanan adalah hierarki objek pemandangan dan jendela properti. Agak merepotkan untuk memanipulasi nilai numerik dengan cepat - Anda harus masuk ke ikon dengan panah kecil. Beberapa slider pada awalnya menyesatkan, karena mereka tidak menunjukkan seluruh rentang parameter yang mungkin, tetapi, katakanlah, hanya interval dari 0 hingga 1. Kecepatan penerbangan kamera diatur di lapangan dengan seorang pelari di atas, secara default entah bagaimana ia bergerak perlahan, menilai sensasi. . Mungkin ini lebih nyaman ketika Anda bekerja dengan model pada skala nyata.


All Articles