Уроки, алгоритмы, программы, примеры

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

У меня проблема вот с этим: gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);. Вылезает ошибка: CS1061 "object" не содержит определения "GL_COLOR_BUFFER_BIT", и не удалось найти доступный метод расширения "GL_COLOR_BUFFER_BIT",...
Большое спасибо. Единственный код который прошел без каких либо ошибок. Ура!!!
Скажите пожалуйста, подскажите алгоритм по которому по заданным точкам можно определить тип многогранника, скажем это куб или прямоугольный параллелепипед. Нашел теорию по этим фигурам: https://www.mat... https://www.mat... Акцентировать внимание...
Всем у кого не работает. файл wizard.script Ещё одно упоминание Glut32 в строке "if (!VerifyLibFile(dir_nomacro_lib, _T("glut32"), _T("GLUT's"))) return false;" меняем на "if (!VerifyLibFile(dir_nomacro_lib, _T("freeglut"), _T("GLUT's"))) return...
Не получается, емаё

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Среда программирования: 
Unity3D

Для начала я объясню зачем я делаю не 2 отдельных урока, а один, но большой. Так как они очень взаимосвязаны.
Начнем с создания плоскости так как я уже рассказывал, как это делается я просто покажу что у меня получилось.

Далее создаём объект капсула.
После чего новый объект, который я назову «First Person Controller»
Размещаем камеру так, чтобы его капсулы не было видно, а камера находилась ровно над ней. После перетаскиваем объект «Капсула» и «Камера» в наш объект «First Person Controller».
Всё подготовка окончена.
Теперь необходимо запрограммировать движения нашей игровой модели.
Начнём с вращения камеры.
Для этого в «First Person Controller» создаём скрипт (На C#) я назвал его (Mouse Look)
(Скрипт прилагается и выложен на сайте)

Рассмотрим некоторые моменты в нашем коде.

public enum RotationAxes { MouseXAndY = 0, MouseX = 1, MouseY = 2 }
	public RotationAxes axes = RotationAxes.MouseXAndY;
	public float sensitivityX = 15F;
	public float sensitivityY = 15F;
 
	public float minimumX = -360F;
	public float maximumX = 360F;
 
	public float minimumY = -60F;
	public float maximumY = 60F;

//Здесь мы задаём максимальные и минимальные параметры вращения камеры.
void Update ()
	{
		if (axes == RotationAxes.MouseXAndY)
		{
			float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
 
			rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
			rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
 
			transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
		}
		else if (axes == RotationAxes.MouseX)
		{
			transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityX, 0);
		}
		else
		{
			rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
			rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
 
			transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y, 0);
		}
	}

Далее просто устанавливаем слежение за объектом мышь, что бы камера поворачивалась с поворотом мыши. Увеличивая параметр вращения камеры в зависимости от положения мыши.
void Start ()
	{
		if (GetComponent<Rigidbody>())
			GetComponent<Rigidbody>().freezeRotation = true;
	}
}

Ну и последнее мы попросту указываем что тело имеет плотность для того что бы камера не проваливалась сквозь него.

Наш скрипт смотрит где находится мышка и поворачивает камеру в зависимости от перемещения мышки.

Далее создаём новый скрипт, но уже на JS я назвал его (Character Motor).
(Скрипт прилагается)
Но на мелких аспектах остановлюсь по подробнее.
Первым у нас описан класс «CharacterMotorJumping» который описывает прыжки причем только положения прыжка в верх спуском у нас занимается другой класс.
Может ли он прыгать?
var enabled : boolean = true;
В этих переменных мы указываем минимальную и максимальную высоту прыжка (зависящую от скорости нажатия на клавишу пробел)

var baseHeight : float = 1.0;
	var extraHeight : float = 4.1;

Далее мы попросту описываем, перемещение по оси Y которое и является прыжком. При помощи подключенных к Unity пакетов.
Далее мы описываем перемещение нашего объекта.
 var maxForwardSpeed : float = 10.0;
	var maxSidewaysSpeed : float = 10.0;
	var maxBackwardsSpeed : float = 10.0;

Задав максимальную скорость перемещения по всем плоскостям, мы ограничиваем её, не давая нашему объекту «улететь в космос».
var gravity : float = 10.0;
После чего указывается поправка на гравитацию для того что бы наш объект перемещался лишь по земле, а не летал.
И опять используем уже готовые пакеты.
После чего мы создаем новый класс «CharacterMotorSliding»
Для того что бы наш объект при спуске на землю на падал как камень, а имел более-менее реальный вид падения объекта.
Где мы задаём скорость падения (Для удобства Unity воспринимает параметры переных скорости в метрах в секунду).
Так же по желанию можно создать «MovementTransferOnJump» для того что бы мы во время полёта могли направлять перемещение в ту либо иную сторону.
После чего остаётся лишь оживить наш объект при помощи запуска скрипта, который будет контролировать перемещения его. Для это мы берём стандартный скрипт FPSInputController.
Который кстати выглядит так.
private var motor : CharacterMotor;
 
// Use this for initialization
function Awake () {
	motor = GetComponent(CharacterMotor);
}
 
// Update is called once per frame
function Update () {
	// Get the input vector from kayboard or analog stick
	var directionVector = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
 
	if (directionVector != Vector3.zero) {
		// Get the length of the directon vector and then normalize it
		// Dividing by the length is cheaper than normalizing when we already have the length anyway
		var directionLength = directionVector.magnitude;
		directionVector = directionVector / directionLength;
 
		// Make sure the length is no bigger than 1
		directionLength = Mathf.Min(1, directionLength);
 
		// Make the input vector more sensitive towards the extremes and less sensitive in the middle
		// This makes it easier to control slow speeds when using analog sticks
		directionLength = directionLength * directionLength;
 
		// Multiply the normalized direction vector by the modified length
		directionVector = directionVector * directionLength;
	}
 
	// Apply the direction to the CharacterMotor
	motor.inputMoveDirection = transform.rotation * directionVector;
	motor.inputJump = Input.GetButton("Jump");
}
 
// Require a character controller to be attached to the same game object
@script RequireComponent (CharacterMotor)
@script AddComponentMenu ("Character/FPS Input Controller")

По сути он следит за положением объекта и обновляет его положение (О наличии того либо иного готового скрипта нужно зайти на сайт Unity3d.com и прочесть о наличии базовых скриптов). (англ)

Создаём новую камеру в нашем проекте.
Далее для этой камеры в параметре Rotation в X ставим 90. Это означает что камера делает вид сверху.
И в графе Depth мы ставим значение 1. (Наша главная камера имеет значение 0).
Далее можно просто перетащить нашу камеру в объект «First Person Controller» и по сути будет работать и это не будет ошибкой. Но я так делать не стану так как имея 2 камеры мы в 2 раза больше загружаем

Для того что бы это избежать мы создаём скрипт «MiniMap» и выбираем язык C#.

using UnityEngine;
using System.Collections;
 
public class MiniMap : MonoBehaviour {
 
	public Transform Targer;
	void LateUpdate () {
		transform.position = new Vector3 (Targer.position.x, transform.position.y, Targer.position.z);
	}
}

Для начала мы используем нашу переменную «Transform» на нашу цель «Targer» которым и будет являться наш «First Person Controller».
Далее мы используем нашу процедуру «LateUpdate» для пост обновления
Далее для того что бы камера следила за нашим объектом мы указываем позиции которые меняются только X и Z в зависимости от позиции нашего объекта.
После чего приписываем слежение за нашим объектом выбором в графе «Target» «First Person Controller».
Всё теперь камера следит за нашим объектом. Но нашу проблему это так и не решило.
Для оптимизации нам необходимо сделать дубликат нашего «terrain» (Просто копировать и вставить). Я назвал его «terrainMinMap»
После чего в параметре Трея в PixelError ставим значение ухудшения качества (я поставил 250).
А в «Base Map Dist.» ставим значение 70 (было 1000).
Остальные параметры качества мы попросту отключаем.
Далее создаем новый слой «Edit» «Minmap» и «Player»
После чего выбрав «Main Camera» в параметре «Cullind Mask» выбираем всё кроме «Minimap». А это значит, что наша главная камера будет просчитывать всё кроме «Minimap».
А в нашей «Minimap» камере мы выбираем ничего кроме «Minmap» и «Player». После чего мы выбираем наш «TerrainMinMap» и «layer» ему ставим «Minimap».
Теперь работает однако не показан наш сам объект. Для исправления этой ошибки мы ставим нашему «First Person Controller» «layer» «Minmap».
Теперь всё работает. Для удобства показа я чучуть переделал карту.

В итоге оно выглядит у нас так.