Jump to content

Выбор объекта мышкой


photo

Recommended Posts

Только начал изучать Unigine, и есть проблема. У меня есть модель из множества объектов

Я хочу сделать информацию при выборе объекта. (Клика погибает на объекте и при выборе объекта с текстом)

Как это можно сделать 

Безымянный.png

Edited by heos666
Link to comment

Добрый день!

Подобный функционал есть в "Oil Refinery" демо, который можно скопировать как проект прямо в SDK Browser и посмотреть как это было реализовано.

Спасибо!

oilrefinery.jpg

Link to comment

Здравствуйте! 

В качестве простого примера отображения информации о ноде на C# можно попробовать такую компоненту:

using System;
using System.Collections;
using System.Collections.Generic;
using Unigine;

#if UNIGINE_DOUBLE
using Vec3 = Unigine.dvec3;
#else
    using Vec3 = Unigine.vec3;
#endif

[Component(PropertyGuid = "AUTOGEN_GUID")]//<-- Здесь должен быть GUID вашей новой компоненты
public class SelectedNodeInfo : Component
{
	private Unigine.Object selected_object = null;

	[MethodInit(Order=2)]
	private void Init()
	{
		// переключаем режим работы с курсором мыши, чтобы он не исчезал при клике
		Input.MouseHandle = Input.MOUSE_HANDLE.SOFT;
		// включаем Visualizer
		Visualizer.Mode = Visualizer.MODE.ENABLED_DEPTH_TEST_ENABLED;
	}

	private void Update()
	{
		// проверяем, состояние левой кнопки мыши     
		if(Input.IsMouseButtonDown(Input.MOUSE_BUTTON.LEFT))
		{
			Player player = Game.Player;
			// задаем начало отрезка (p0) в позиции камеры и конец (p1) - в точке, направление в которую указывает курсор мыши
			ivec2 mouse = Input.MousePosition;
			Vec3 p0 = player.WorldPosition;
			Vec3 p1 = p0 + new Vec3(player.GetDirectionFromMainWindow(mouse.x, mouse.y)) * 100;

			// создаем экземпляр класса WorldIntersection для хранения информации о пересечении
			WorldIntersection intersection = new WorldIntersection();

			// пускаем луч из точки p0 в точку p1 чтобы найти первый пересеченный объект
			Unigine.Object obj = World.GetIntersection(p0, p1, 1, intersection);

			// если объект обнаружен, запоминаем как выделенный
			if(obj)
				selected_object = obj;
			else
				selected_object = null;
			
		}
		// если есть выделенный объект
		if (selected_object)
		{
			// формируем строку для отображения информации об объекте
			String message = String.Format("{0}\n Этот объект ...\nТекущие координаты:\n ({1}, {2}, {3})", selected_object.Name, selected_object.WorldPosition.x, selected_object.WorldPosition.y, selected_object.WorldPosition.z);
			
			// отрисовываем баунд для объекта
			Visualizer.RenderNodeBoundBox(selected_object, new vec4(0.0f, 1.0f, 0.0f, 1.0f));
			
			// отрисовываем полупрозрачный бокс по баунду и выводим информационный текст
			Visualizer.RenderSolidBox(new vec3(selected_object.WorldBoundBox.maximum - selected_object.WorldBoundBox.minimum), MathLib.Translate(selected_object.WorldBoundBox.Center), new vec4(0.0f, 1.0f, 0.0f, 0.3f));
			Visualizer.RenderMessage3D(selected_object.WorldPosition,new Vec3(0.0f), message, new vec4(1.0f), 1, 20);
		}
	}
}

Чтобы проверить ее в работе:

  1. Создайте компоненту SelectedNodeInfo  и откройте ее в IDE.
  2. Вставьте в нее приведенный выше код.
  3. Вернитесь в редактор и назначьте компоненту на какую-либо ноду в сцене
  4. Нажмите Play.

Работает она примерно так:

image.png

Спасибо!

  • Like 2
Link to comment
×
×
  • Create New...