Страница 1 из 1

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

СообщениеДобавлено: 22 июн 2017, 19:45
End_User
Приветствую!

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

Контекст вопроса: на сколько сдвигать текстуру гусеницы трактора (вроде сдвиг изменяется от 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 приходится задавать на глазок через Инспектор, подбирая значения, чтобы текстура не "прыгала" при вращении гусеницы.

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

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

Ответ на сколько нужно сместить текстуру - на D / L. D - пройденный путь, L - длинна гусеницы. Может еще минус нужен чтобы она крутилась в нужную сторону.

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

СообщениеДобавлено: 23 июн 2017, 20:24
End_User
Гусеница - меш. Его габариты известны: 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 знает!

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

СообщениеДобавлено: 23 июн 2017, 22:12
waruiyume
Синтаксис:
Используется 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));
        }
}
 

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

СообщениеДобавлено: 24 июн 2017, 01:01
Woolf
Гусеница - меш. Его габариты известны

Строго говоря, вам нужны параметры не всей гусеницы, а только той части, которая касается земли. Гусеницы все стандартизированы, как и их рисунок, в параметры гусеницы сразу и забивайте ширину и длину гусеницы и рисунок протектора. Из этих параметров и вычислите все, что вам нужно.

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

СообщениеДобавлено: 24 июн 2017, 04:30
End_User
waruiyume писал(а):using UnityEngine;

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

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

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

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

Как мне узнать "ширину и длину гусеницы и рисунок протектора"?
В смысле я легко и сравнительно гарантированно из произвольного меша достану его оболочку и размер оболочки вдоль по оси Z, что даст ширину гусеницы.
У меня (возможно неверное) ощущение, что ваше "рисунок протектора" как раз и есть мой первоначальный вопрос "как найти размер текстуры в мировых единицах".

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

СообщениеДобавлено: 24 июн 2017, 07:01
waruiyume
Tile должен быть такой же, что и параметре материала.

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

СообщениеДобавлено: 24 июн 2017, 12:38
End_User
/me thinking..... 37% complete

Значит я обязан задать tiling, что влияет на количество текстур вдоль реальной длины гусеницы?

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

СообщениеДобавлено: 01 июл 2017, 08:08
End_User
Пока ждал ответа, до меня дошло. 8()
В вашей модели tiling=5, в моей 1.
Поэтому в моей модели не нужно выискивать как мне в мою модель запихнуть 5.
Проблема превратилась в определение общей длины гусеницы, но таки да, SOLVED.
Огромное спасибо!