[Solved] На сколько сдвигать текстуру гусеницы?

Программирование на Юнити.

[Solved] На сколько сдвигать текстуру гусеницы?

Сообщение End_User 22 июн 2017, 19:45

Приветствую!

Есть ли способ узнать реальный размер текстуры на сцене?

Контекст вопроса: на сколько сдвигать текстуру гусеницы трактора (вроде сдвиг изменяется от 0% до 100% длин текстуры?), если известно, что он проехал, скажем, ровно метр?

Осложнения: текстура может быть применена в разных тракторах с разными размерами гусениц, разве что я гарантирую масштаб каждой графмодели 1:1.

Спасибо!

На данный момент код таков:
Синтаксис:
Используется csharp
        //Scroll texture for left caterpillar
        Vector2 posTexture = LeftTrack.GetComponent<MeshRenderer>().material.mainTextureOffset;
        posTexture.x = Mathf.Repeat(posTexture.x + distLeftWheelTravel / TextureLength, TextureLength);
        LeftTrack.GetComponent<MeshRenderer>().material.mainTextureOffset = posTexture;
 

Сейчас TextureLength приходится задавать на глазок через Инспектор, подбирая значения, чтобы текстура не "прыгала" при вращении гусеницы.
Последний раз редактировалось End_User 01 июл 2017, 08:09, всего редактировалось 1 раз.
End_User
UNец
 
Сообщения: 22
Зарегистрирован: 02 фев 2014, 15:30

Re: Размер текстуры в мире?

Сообщение snezhok_13 23 июн 2017, 12:13

Не уверен, что до конца понял задачу, но другими словами это: Имеем размеры гусеницы (мировые), если это какой-нибудь вид сверху то это квад, если нет то какой-то скругленный параллелипепед, длину этой "гусеницы" мы можем вычислить (Как? Руконьками, зависит от того какой меш, какой радиус скругления и длина).

Ответ на сколько нужно сместить текстуру - на D / L. D - пройденный путь, L - длинна гусеницы. Может еще минус нужен чтобы она крутилась в нужную сторону.
Разработка игр, немножко игровая журналистика, сейчас делаем Календарь: даты выхода игр
Аватара пользователя
snezhok_13
UNIверсал
 
Сообщения: 450
Зарегистрирован: 09 сен 2013, 11:12
Skype: s.coremission
  • Сайт

Re: Размер текстуры в мире?

Сообщение End_User 23 июн 2017, 20:24

Гусеница - меш. Его габариты известны: float distTrackLeftLength = gobjTrackLeft.GetComponent<MeshFilter>().sharedMesh.bounds.extents.z;
Ну, пусть 5 метров в одну сторону. То есть продольный размер от носа до кормы.
На меш кладётся, как полагается, текстура 512*512 (неважно, может 256*256) пикселей. Многократно кладётся со своим периодом, чтобы нужное, неизвестное мне, количество раз покрывало эти 5 метров (или 10±, в обе стороны). То есть, вы правы, собственно и реальную длину гусеницы я не знаю. При езде я должен сдвигать текстуру пропорционально пройденному пути (путь-то ясен).
Итого, невозможно автоматически знать реальную длину полной гусеницы, и я не знаю, сколько раз на неё легла текстура.
Я бы мог предположить, что 512 пикселей равны поперечной ширине гусеницы, если бы на самом деле меш не разворачивался на эту текстуру два-пять раз - вид на гусеницу сверху, снизу, слева, справа, зубцы для удержания. То есть с этой стороны к вопросу подобраться не получится.
----------------------------------------------------------------------------------
Изображение
----------------------------------------------------------------------------------
А вопрос, собственно, в том, что мне положить в переменную TextureLength. Сейчас я вручную угадываю 1.4 метра и вручную вписываю в Инспектор (При 1.4 метра скроллинг текстуры в целом не создаёт заметных глазу рывков, когда текстура при сдвиге возвращается в изначальную позицию).
Как вместо ручного подбора 1.4 высчитывать это значение автоматически?
Ведь проблема в том, что моделей техники может быть много, каждая со своими мешами и текстурами гусениц.
Но ведь Unity3D как-то сам решает масштабы и решает какого размера на миру рисовать квадрат текстуры, как он масштабирует эти 515*512 пикселей до мировых размеров. Тут бы его и можно было подловить - ведь, если ширина гусеницы не известна, как текстура в ширину гусеницы укладывается не известно, но сколько метров займёт текстура вдоль гусеницы Unity3D знает!
End_User
UNец
 
Сообщения: 22
Зарегистрирован: 02 фев 2014, 15:30

Re: Размер текстуры в мире?

Сообщение waruiyume 23 июн 2017, 22:12

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

[ExecuteInEditMode]
public class NewBehaviourScript : MonoBehaviour
{
    public Material mat;
    public float tile = 5;
    public Transform[] lengthVerts;

    private Vector3 lastPosP;
    private float lengthP = 5;


    void Start()
    {
        lastPosP = transform.position;
        lengthP = CalculateLength();
    }

    [ContextMenu("ReclcLength")]
    void ReclcLength()
    {
        lengthP = CalculateLength();
    }

    float CalculateLength()
    {
        if (lengthVerts.Length < 2)
            return 1;

        float total = 0;
        for (int i = 0; i < lengthVerts.Length - 2; i++)
            total += Vector3.Distance(lengthVerts[i].position, lengthVerts[i + 1].position);
        total += Vector3.Distance(lengthVerts[0].position, lengthVerts[lengthVerts.Length-1].position);
        return total;
    }

    void Update ()
        {
            var delta = transform.position - lastPosP;
            var deltaX = delta.x;

            if (mat)
                mat.SetTextureOffset("_MainTex", new Vector2(-deltaX / (lengthP / tile), 0));
        }
}
 
У вас нет доступа для просмотра вложений в этом сообщении.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Размер текстуры в мире?

Сообщение Woolf 24 июн 2017, 01:01

Гусеница - меш. Его габариты известны

Строго говоря, вам нужны параметры не всей гусеницы, а только той части, которая касается земли. Гусеницы все стандартизированы, как и их рисунок, в параметры гусеницы сразу и забивайте ширину и длину гусеницы и рисунок протектора. Из этих параметров и вычислите все, что вам нужно.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Размер текстуры в мире?

Сообщение End_User 24 июн 2017, 04:30

waruiyume писал(а):using UnityEngine;

Спасибо!
/me вкуривает магию.
При подстановке в переменную Tile значения 4.91 гусеница весьма точно неподвижна относительно земли.
Дайте мне полдня-день, чтобы понять магию решения и смысл этого 4.91. В частности, буду вникать, откуда вы взяли "5" в приложенном вами проекте.
Вы ведь не против, если у меня возникнут уточняющие вопросы?
И да, простите, что я запамятовал сразу приложить меш гусеницы, раз вам пришлось его прикидывать самостоятельно.

Woolf писал(а):
Гусеница - меш. Его габариты известны

Строго говоря, вам нужны параметры не всей гусеницы, а только той части, которая касается земли.

Это как? Извините, тут две вещи я не понял: как автоматически найти часть, касающуюся земли, в каком виде её вернуть и что делать с такими данными в отношении текстуры неизвестного мирового размера.
Woolf писал(а):Гусеницы все стандартизированы, как и их рисунок, в параметры гусеницы сразу и забивайте ширину и длину гусеницы и рисунок протектора. Из этих параметров и вычислите все, что вам нужно.

Как мне узнать "ширину и длину гусеницы и рисунок протектора"?
В смысле я легко и сравнительно гарантированно из произвольного меша достану его оболочку и размер оболочки вдоль по оси Z, что даст ширину гусеницы.
У меня (возможно неверное) ощущение, что ваше "рисунок протектора" как раз и есть мой первоначальный вопрос "как найти размер текстуры в мировых единицах".
End_User
UNец
 
Сообщения: 22
Зарегистрирован: 02 фев 2014, 15:30

Re: Размер текстуры в мире?

Сообщение waruiyume 24 июн 2017, 07:01

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

Re: Размер текстуры в мире?

Сообщение End_User 24 июн 2017, 12:38

/me thinking..... 37% complete

Значит я обязан задать tiling, что влияет на количество текстур вдоль реальной длины гусеницы?
End_User
UNец
 
Сообщения: 22
Зарегистрирован: 02 фев 2014, 15:30

Re: Размер текстуры в мире?

Сообщение End_User 01 июл 2017, 08:08

Пока ждал ответа, до меня дошло. 8()
В вашей модели tiling=5, в моей 1.
Поэтому в моей модели не нужно выискивать как мне в мою модель запихнуть 5.
Проблема превратилась в определение общей длины гусеницы, но таки да, SOLVED.
Огромное спасибо!
End_User
UNец
 
Сообщения: 22
Зарегистрирован: 02 фев 2014, 15:30


Вернуться в Скрипты

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

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