Получить имя текстуры на терреине [Решено]

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Получить имя текстуры на терреине [Решено]

Сообщение Receptor 17 июн 2012, 22:10

Нужно узнать имя текстуры с которым сталкивается луч. С обычным объектом проблем не возникло, а как быть с терреин коллайдером?

Синтаксис:
Используется csharp
Ray chekerRayDown = new Ray(transform.position, -transform.up);
                RaycastHit chekerRayDownHit;
               
                if (Physics.Raycast(chekerRayDown, out chekerRayDownHit, 5)){
                        materialName = chekerRayDownHit.collider.renderer.material.name;
                }
               

 


на всех объектаъ показывает имя материала, на терреине молчит. Как быть?
Последний раз редактировалось Receptor 22 окт 2012, 02:16, всего редактировалось 1 раз.
_VK.com
Аватара пользователя
Receptor
Адепт
 
Сообщения: 1706
Зарегистрирован: 22 ноя 2011, 07:09
Откуда: Волгодонск

Re: Получить имя текстуры на терреине

Сообщение waruiyume 17 июн 2012, 22:31

Можно узнать какой прототип, сильнее всего воздействует на некоторую точку террейна, а там уже можно и текстуру дёрнуть.
На землю:
Синтаксис:
Используется csharp
using UnityEngine;

public class Terr : MonoBehaviour
{
      private Terrain terr;//земля
      private byte[,] splatIndex;//итоговый 2d массив с индексами максимально воздействующих текстур
      private Vector3 size;//размер земли
      private Vector3 tPos;//положение земли
      private int width;//размер текстуры маски
      private int height;//

   void Start ()
   {
          terr = GetComponent<Terrain>();//получение ссылки на землю
       CalcHiInflPrototypeIndexesPerPoint();//вызов метода подготавливающего итоговый массив
   }

      private void CalcHiInflPrototypeIndexesPerPoint()
      {
          TerrainData terrainData = terr.terrainData;//структура с большей частью земельных танных
          size = terrainData.size;//                         |
          width = terrainData.alphamapWidth;//      |просто копирование из земли в переменные
          height = terrainData.alphamapHeight;//    |
          int prototypesLength = terrainData.splatPrototypes.Length;//те самые прототипы (кол-во текстур на земле)
          tPos = terr.GetPosition();//      |просто копирование из земли в переменные

          float[, ,] alphas = terrainData.GetAlphamaps(0, 0, width, height);//копирование массива с силами воздействия каждой теустуры
          splatIndex = new byte[width, height];//инициализация массива

          for (int x = 0; x < width; x++)//     |
          {//                                                | обход массива xy
              for (int y = 0; y < height; y++)// |
              {
                  byte ind = 0;//индекс последней текстуры с максимальным воздействием
                  float t = 0f;//последняя наибольшая сила воздействия
                  for (byte i = 0; i < prototypesLength; i++)обход массива z
                      if (alphas[x, y, i] > t)//этот "слой" воздействует сильней
                      {
                          t = alphas[x, y, i];//индекс последней текстуры = текущий
                          ind = i;//наибольшая сила воздействия = текущая
                      }
                  splatIndex[x, y] = ind;//присвоение индекса
              }
          }
      }

      public int GetMaterialIndex(Vector3 pos)//возвращает индекс текстуры имеющей координаты pos
      {
          pos = pos - tPos;//глобальная позиция в локальную
          pos.x /= size.x;//|нормирование позиции
          pos.z /= size.z;//|

          return splatIndex[(int)(pos.z * (width - 1)),//|из локальной в позицию в массиве
                    (int)(pos.x * (height - 1))];//              |и возврат значения
      }
}
 

На камеру:
Синтаксис:
Используется csharp
using UnityEngine;

public class TestCaster:MonoBehaviour
{
      private RaycastHit hit;

      private int matIndex;

      void Update()
      {
          if(Physics.Raycast(camera.ScreenPointToRay(Input.mousePosition),out hit))
          {
              Terr t = hit.transform.GetComponent<Terr>();
              if(t!=null)
              {
                  matIndex = t.GetMaterialIndex(hit.point);
              }
          }
      }

      void OnGUI()
      {
          GUI.Box(new Rect(10,10,50,50),matIndex.ToString() );
      }
}
 
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Получить имя текстуры на терреине

Сообщение Receptor 17 июн 2012, 22:45

Объясни мне нубу пожалуйста, что значит "какой прототип, сильнее всего воздействует на некоторую точку террейна" :)) Очень прошу! Что есть "прототип" в данном контексте?

upd.
Нашел в вики что такое прототип в ооп, но все равно прочитав определение и просмотрев пример, почуствовал себя недоразвитым каким-то :) Ладно. Спасибо большое за пример. Постараюсь что-то понять методом научного тыка!
_VK.com
Аватара пользователя
Receptor
Адепт
 
Сообщения: 1706
Зарегистрирован: 22 ноя 2011, 07:09
Откуда: Волгодонск

Re: Получить имя текстуры на терреине

Сообщение waruiyume 18 июн 2012, 00:48

Добавил комментарии.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Получить имя текстуры на терреине

Сообщение Receptor 22 окт 2012, 02:16

К сожалению мозгов хватило только сейчас, чтобы понять хоть немного, что ты написал, поэтому хочу сказать огромное спасибо тебе! Очень пригодилось. :)

Декали отлично слушаются
Изображение
_VK.com
Аватара пользователя
Receptor
Адепт
 
Сообщения: 1706
Зарегистрирован: 22 ноя 2011, 07:09
Откуда: Волгодонск


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 29