Вода и физика воды, мысли, идеи?

Общие вопросы о Unity3D

Re: Вода и физика воды, мысли, идеи?

Сообщение Левш@ 29 дек 2011, 03:30

как получить вершины из вертекс шейдера.

Я тоже с шейдерами как то не очень...
Все что мне нужно - это получать каждый кадр высоту либо вершины, либо полигона который находиться в данный момент под обьектом, динамически изменяющейся в реалтайме меши.
Т.е - есть вода с волнами, волны двигаются по воде, соответственно высота воды в определенной точке все время изменяеться. Вот нужно отслеживать эти изменения и передавать их обьекту, чтоб обьект двигался вверх\вниз вместе с волнами. Симуляция плавания. Обьект может двигаться по воде управляемый Игроком, соответственно где бы он ни был, он должен считывать высоту полигона, который прямо под его центром и применять к своему - transform.position.y.
Рейкаст и коллайдер полностью игнорируют динамику меши... нужен другой метод. Видимо тут надо работать с массивом самой меши, но как это сделать я что то не могу сообразить никак... надо видимо сначала вычислить тот самый, нужный нам полигон по координатам на плоскости воды а потом как то измерить его моментальную высоту глобально по оси Y.
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Вода и физика воды, мысли, идеи?

Сообщение Woolf 29 дек 2011, 11:55

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

Re: Вода и физика воды, мысли, идеи?

Сообщение NordMan 25 янв 2012, 17:39

Самое сложное - заставить себя читать:
Mesh http://unity3d.com/support/documentation/ScriptReference/Mesh.html
Пример второй.

Дальше проще:
1. Получаем матрицу точек плоскости.
2. Модифицируем координату "У"
3. Применяем модификацию к плоскости.

Теперь как модифицировать.
Формула плоской волны(бегущей в натянутом шнуре): F(y,t)=a*cos(w*(t-y/v)), где: v - скорость волны, w - циклическая частота, a - амплитуда.
Переводим эту формулу на плоскость: F(y,t) = a*cos(w*(t-RN/v)) где: RN - проекция(скалярное произведение) вектора направления на оси координат.
Более подробно в учебнике физики за второй курс. (Рекомендую Иродов И.Е. т.4 Волновые процессы. Глава 1. Параграф 1)

Ну и остается добавить, что реальная волна в море/океане есть сложение 4 волн (2 по 2 пары). 1-я пара дает "основную волну", 2-я пара мелкую рябь. Волны в парах должны складываться под углом, приблизительно равным 90 град.(от 70 до 120 проверено на практике)
NordMan
UNец
 
Сообщения: 1
Зарегистрирован: 14 окт 2011, 18:22

Re: Вода и физика воды, мысли, идеи?

Сообщение Левш@ 26 янв 2012, 07:33

Все это красиво выглядет, но проблема в том, что коллайдеры обьектов как и райкаст полностью игнорируют изменение геометрии в реал тайме...
Нужно чтоб обьект плавал на волнах, а он застывает на нулевой координате плоскости...
А визуально сделать волны не мудрено, есть много способов, вопрос в том чтоб сделать воду с волнами, которые взаимодействуют с обьектами. :-?
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Вода и физика воды, мысли, идеи?

Сообщение Order 26 янв 2012, 08:36

Зацепиться за вершины и плавать :)
Добавить rusorder в Skype , _juc4you@mail.ru ;
Платные консультации, программирование ваших проектов Unity3d,C#,IOS,Android.
Скрытый текст:
_ttp://www.youtube.com/watch?v=1m2qTnatSjM&list=UUjcKNvONEUHCILG7QrX1NFg
Order
Старожил
 
Сообщения: 805
Зарегистрирован: 21 фев 2010, 10:34

Re: Вода и физика воды, мысли, идеи?

Сообщение waruiyume 26 янв 2012, 11:31

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

public class Wave : MonoBehaviour
{
    private Mesh mesh;
    private MeshFilter filter;

    private Vector3[] vtxs;
    private int[] tris;

    private Ray ray;
    private Matrix4x4 mat;
    Plane plane;
    private float pDist;

        void Awake ()
        {
            filter = GetComponent<MeshFilter>();
            mesh = filter.mesh;
            vtxs = mesh.vertices;
            tris = mesh.triangles;
        }
       
        void FixedUpdate ()
        {
        mat = transform.localToWorldMatrix;
            mesh = filter.mesh;
            vtxs = mesh.vertices;

            for (int v = 0; v < vtxs.Length; v++)
            {
            vtxs[v].y = (Mathf.Sin(vtxs[v].x + Time.time) + Mathf.Cos(vtxs[v].z + Time.time)) * 10f;
            }
            mesh.vertices = vtxs;
            filter.mesh = mesh;
        }

    public void SetPosition(Transform boat,RaycastHit hit)
    {
        ray = new Ray(new Vector3(boat.position.x, 50f, boat.position.z), -Vector3.up);
        Vector3 p0 = mat.MultiplyPoint(vtxs[tris[hit.triangleIndex*3]]);
        Vector3 p1 = mat.MultiplyPoint(vtxs[tris[hit.triangleIndex * 3 + 1]]);
        Vector3 p2 = mat.MultiplyPoint(vtxs[tris[hit.triangleIndex * 3 + 2]]);

        plane = new Plane(p0, p1, p2);

        if (plane.Raycast(ray, out pDist))

            boat.position = new Vector3(boat.position.x, ray.GetPoint(pDist).y, boat.position.z);
    }
}
 

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

public class BoatController:MonoBehaviour
{
    private Ray ray;
    private RaycastHit hit;
    private Wave wave;

    void FixedUpdate()
    {
        ray = new Ray(new Vector3(transform.position.x, 50f, transform.position.z), -Vector3.up);
        if (Physics.Raycast(ray, out hit, 100f))
        {
            wave = hit.collider.gameObject.GetComponent<Wave>();
            if(wave!=null)
                wave.SetPosition(transform,hit);
        }

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

Re: Вода и физика воды, мысли, идеи?

Сообщение Левш@ 26 янв 2012, 15:43

-Vector3.up

Кстати Vector3.down тоже работает. ;)

Весьма неплохо спс за идею, а если обьект будет двигаться (плыть), он останеться на поверхности ?
Я с этими матрицами пока не оч. разобрался, как оно работает...
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Вода и физика воды, мысли, идеи?

Сообщение waruiyume 26 янв 2012, 16:43

  1. из точки заведомо выше воды пускается луч.
  2. Из хита по коллайдеру берётся индекс треугольника.
  3. Из трёх вершин треугольника создаётся плоскость.
  4. По плоскости пускается луч.

Синтаксис:
Используется csharp
Vector3 p0 = mat.MultiplyPoint(vtxs[tris[hit.triangleIndex*3]]);

То же, что и:
Синтаксис:
Используется csharp
Vector3 p0 =
     transform.rotation*
      Vector3.Scale(vtxs[tris[hit.triangleIndex*3]],transform.localScale)
      + transform.position;


Кстати Vector3.down тоже работает. ;)

Это свойство было всегда? В оффлайн документации его нет :(
upd
Лучше использовать MultiplyPoint3x4, а не MultiplyPoint.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Вода и физика воды, мысли, идеи?

Сообщение Левш@ 26 янв 2012, 22:45

Это свойство было всегда? В оффлайн документации его нет

Знаю что нет, я тупо вписал, работает. :D
И .right тоже работает и .back должно (не пробовал) .
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Вода и физика воды, мысли, идеи?

Сообщение Cyrix 18 окт 2018, 21:20

Как сделать вот это
Синтаксис:
Используется csharp
void FixedUpdate ()
        {
                mat = transform.localToWorldMatrix;
                mesh = filter.mesh;
                vtxs = mesh.vertices;
               
                for (int v = 0; v < vtxs.Length; v++)
                {
                        vtxs[v].z = (Mathf.Sin(vtxs[v].x*50 + Time.time) + Mathf.Cos(vtxs[v].y*50 + Time.time)) * 0.01f;
                }
                mesh.vertices = vtxs;
                filter.mesh = mesh;
        }
 


только для сферы, а не для плоскости?
Cyrix
UNIт
 
Сообщения: 116
Зарегистрирован: 16 сен 2009, 11:32

Re: Вода и физика воды, мысли, идеи?

Сообщение Cyrix 19 окт 2018, 01:08

Есть мысли как это сделать?
Cyrix
UNIт
 
Сообщения: 116
Зарегистрирован: 16 сен 2009, 11:32

Re: Вода и физика воды, мысли, идеи?

Сообщение Cyrix 19 окт 2018, 09:23

Ладно... есть точка "А" в пространстве, называемая центром сферы. Есть ещё одна точка "Б", которая находится на поверхности сферы. Как найти вектор "А-Б" и уменьшить или увеличить расстояние между точками "Б" и "А"?
Cyrix
UNIт
 
Сообщения: 116
Зарегистрирован: 16 сен 2009, 11:32

Re: Вода и физика воды, мысли, идеи?

Сообщение Shock 19 окт 2018, 18:27

(Б-А) - позиция точки на сфере относительно ее центра
изменяем эту позицию (скажем, умножаем на коэфициент и возвращаем в мировые координаты)

(Б-А)*коэф + А
Аватара пользователя
Shock
UNIт
 
Сообщения: 77
Зарегистрирован: 10 окт 2016, 18:22

Re: Вода и физика воды, мысли, идеи?

Сообщение Cyrix 20 окт 2018, 18:40

Как реализовать это в коде?
Cyrix
UNIт
 
Сообщения: 116
Зарегистрирован: 16 сен 2009, 11:32

Re: Вода и физика воды, мысли, идеи?

Сообщение seaman 20 окт 2018, 19:36

Вопрос уровня "почемучки". Если Вы просите написать за Вас код - Вам туда.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Пред.След.

Вернуться в Общие вопросы

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15