Вода и всё, связанное с ней - Форум Игроделов
Чт, 02 Май 2024, 21:50 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Игроделов » UNITY3D » ЛАНДШАФТ » Вода и всё, связанное с ней
Вода и всё, связанное с ней
RealGamesWorldДата: Чт, 15 Апр 2010, 12:08 | Сообщение # 1
Карто-строитель
 
Сообщений: 190
Награды: 2
Репутация: 70
Статус: Offline
Как ставить воду в юнит?
 
СообщениеКак ставить воду в юнит?

Автор - RealGamesWorld
Дата добавления - 15 Апр 2010 в 12:08
FunnyAlienДата: Чт, 15 Апр 2010, 12:11 | Сообщение # 2
NYAN-NYAN?
 
Сообщений: 3643
Награды: 14
Репутация: 835
Статус: Offline
В юнит незнаю... В юнити она есть в папке, стандарт ассетс!


Согласно протоколу испытаний, начиная с этого момента, мы перестаем говорить правду. Три, два, один.
 
СообщениеВ юнит незнаю... В юнити она есть в папке, стандарт ассетс!

Автор - FunnyAlien
Дата добавления - 15 Апр 2010 в 12:11
СкептикДата: Чт, 15 Апр 2010, 12:33 | Сообщение # 3
Мыслитель
 
Сообщений: 5860
Награды: 48
Репутация: 1731
Статус: Offline
Берем воду и перетягиваем в сцену, как и любой другой ГО. В чём трабл?
Можно к любой поверхности применить Water-шейдер, и поверхность станет водой.


Фанат игр Max Payne и Fahrenheit.
 
СообщениеБерем воду и перетягиваем в сцену, как и любой другой ГО. В чём трабл?
Можно к любой поверхности применить Water-шейдер, и поверхность станет водой.

Автор - Скептик
Дата добавления - 15 Апр 2010 в 12:33
RealGamesWorldДата: Вт, 20 Апр 2010, 17:20 | Сообщение # 4
Карто-строитель
 
Сообщений: 190
Награды: 2
Репутация: 70
Статус: Offline
нет, а можно как нить чтоб когда зайдешь в воду, игрок плыл?
 
Сообщениенет, а можно как нить чтоб когда зайдешь в воду, игрок плыл?

Автор - RealGamesWorld
Дата добавления - 20 Апр 2010 в 17:20
BLACKДата: Вт, 20 Апр 2010, 17:31 | Сообщение # 5
Wishmaster
 
Сообщений: 635
Награды: 11
Репутация: 285
Статус: Offline
Quote (alec5sei)
нет, а можно как нить чтоб когда зайдешь в воду, игрок плыл?

Можно, посмотри как в островной демке это реализовано, прада там игрок не плывет, придется писать скрипт чтоб в воде отключалась гравитация или как то так wacko
 
Сообщение
Quote (alec5sei)
нет, а можно как нить чтоб когда зайдешь в воду, игрок плыл?

Можно, посмотри как в островной демке это реализовано, прада там игрок не плывет, придется писать скрипт чтоб в воде отключалась гравитация или как то так wacko

Автор - BLACK
Дата добавления - 20 Апр 2010 в 17:31
ЛевшаДата: Вт, 20 Апр 2010, 17:45 | Сообщение # 6
Черный Волк
 
Сообщений: 7257
Награды: 30
Репутация: 3313
Статус: Offline
Если полностью симулировать воду, это сложно.
Придеться писать навороченный код с применением действующих на ГГ противоположнонаправленных, скомпенсированных сил.
Гравитации и выталкивания. То есть написать физическоматематическую модель воды.
Можно и проще конечно замутить, просто коллайдить с верхней частью ГГ, но реалистики не будет.


X.cor.R (Prologue)
 
СообщениеЕсли полностью симулировать воду, это сложно.
Придеться писать навороченный код с применением действующих на ГГ противоположнонаправленных, скомпенсированных сил.
Гравитации и выталкивания. То есть написать физическоматематическую модель воды.
Можно и проще конечно замутить, просто коллайдить с верхней частью ГГ, но реалистики не будет.

Автор - Левша
Дата добавления - 20 Апр 2010 в 17:45
DekterevДата: Вт, 20 Апр 2010, 18:11 | Сообщение # 7
 
Сообщений: 1753
Награды: 16
Репутация: 892
Статус: Offline
В островной демке вода очень похожа на воду в Far Cry 1, но в этой игре, ГГ начинает плыть если погружается в воду на 70...80% по высоте.

Quote (Левша)
писать навороченный код с применением действующих на ГГ противоположнонаправленных, скомпенсированных сил. Гравитации и выталкивания. То есть написать физическоматематическую модель воды.

Зачем сложная физика реальной воды в игре? Сомневаюсь что в том-же Far Cry слишком сложный скрипт...

А может просто убирать гравитацию у ГГ при нахождении в воде, чтобы он просто повисал в воде будучи погруженным полностью в воду. Как в Far Cry сделано, идешь по берегу все более утопая в воде, и вдруг бац! и проваливаешься в толщу воды, то-есть начинаешь плыть. А чтобы проваливаться резко в воду, применить скрипт, в котором будет прописано небольшое перемещение ГГ вниз, для 100% погружения в воду. А в воде просто придавать силу двигающую ГГ с определенной и небольшой скоростью, в нужном направлении. Думаю что не сложнее чем скрипт для машины получится.


Поиск | Правила | Новые сообщения

Сообщение отредактировал Dekterev - Вт, 20 Апр 2010, 18:11
 
СообщениеВ островной демке вода очень похожа на воду в Far Cry 1, но в этой игре, ГГ начинает плыть если погружается в воду на 70...80% по высоте.

Quote (Левша)
писать навороченный код с применением действующих на ГГ противоположнонаправленных, скомпенсированных сил. Гравитации и выталкивания. То есть написать физическоматематическую модель воды.

Зачем сложная физика реальной воды в игре? Сомневаюсь что в том-же Far Cry слишком сложный скрипт...

А может просто убирать гравитацию у ГГ при нахождении в воде, чтобы он просто повисал в воде будучи погруженным полностью в воду. Как в Far Cry сделано, идешь по берегу все более утопая в воде, и вдруг бац! и проваливаешься в толщу воды, то-есть начинаешь плыть. А чтобы проваливаться резко в воду, применить скрипт, в котором будет прописано небольшое перемещение ГГ вниз, для 100% погружения в воду. А в воде просто придавать силу двигающую ГГ с определенной и небольшой скоростью, в нужном направлении. Думаю что не сложнее чем скрипт для машины получится.


Автор - Dekterev
Дата добавления - 20 Апр 2010 в 18:11
СкептикДата: Вт, 20 Апр 2010, 19:14 | Сообщение # 8
Мыслитель
 
Сообщений: 5860
Награды: 48
Репутация: 1731
Статус: Offline
Вообще стоит ждать версию 3.0, и надеяться, что в ней апгрейднут физику. а пока есть несколько различных решений по поводу воды:

Проект с физикой всплывания ГО
Страница с комментариями

Скрипт плавания:

Code

var density = 0.999;  
var airDens = 0.013;  
// In something like gram per cubic centimeter  
var flux : Vector3;  
var gravity = 9.81;  
var surfaceHeight = 0.0;  
var damper = 1.0;  
var thickness = 0.5;  
var normDrag = 0.0;  
var waterDrag = 0.99;  

function OnTriggerEnter (other : Collider) {  
    other.gameObject.SendMessage("YouSwim", true, SendMessageOptions.DontRequireReceiver);  
    other.gameObject.SendMessage("Water", transform, SendMessageOptions.DontRequireReceiver);  
    other.gameObject.SendMessage("Density", thickness, SendMessageOptions.DontRequireReceiver);  
}  

function OnTriggerStay (other : Collider) {  
    if (other.GetComponent(Rigidbody)) {  
       var size = other.bounds.size;  
       var volume : float = size.x*size.y*size.z;  
       var dens = other.rigidbody.mass/volume;  
       other.rigidbody.AddForce(transform.up * ((density-dens) * (surfaceHeight - other.transform.position.y) * damper / thickness - other.rigidbody.velocity.y/gravity) + flux/dens);  
       other.rigidbody.drag = waterDrag + (surfaceHeight - other.transform.position.y) * (waterDrag/gravity) + (0 - other.rigidbody.velocity.y) * (waterDrag/damper);  
       //other.rigidbody.AddTorque(Vector3.Slerp(other.rigidbody.angularVelocity, other.rigidbody.angularVelocity * -thickness, Time.deltaTime));  
       var colliders : Collider[] = Physics.OverlapSphere (other.transform.position, volume/(damper/dens*2));  
       for (var effect in colliders) {  
          if (effect.rigidbody && effect != other && effect.rigidbody.drag != 0.0) {  
             effect.rigidbody.AddForce(other.rigidbody.velocity * (damper/thickness) / effect.rigidbody.mass * Vector3.Normalize(other.rigidbody.velocity).magnitude * airDens);  
             var angl = (other.rigidbody.angularVelocity+other.rigidbody.velocity)/2;  
             effect.rigidbody.AddTorque(angl);  
          }  
       }  
    }  
}  

function OnTriggerExit (obj : Collider) {  
    other.gameObject.SendMessage("YouSwim", false, SendMessageOptions.DontRequireReceiver);  
    obj.rigidbody.drag = normDrag;  
}

Скрипт изменения гравитации

Скрипт покачивания в воде:

Code


// density here is killograms per cubic meter. Unity's world units are meters and mass is commonly assumed to be killograms  
   // Density of wood: 600 kg / cu.m  
   // Density of water 1000 kg / cu meter  
   // Density of iron 7000 kg / cu meter  
   // densityOfBody = b.mass / curBodiesVolume[i];  

var divider = 1.0;  

var airborneDrag = -1.0; //If left at -1 will use the Rigidbody Drag  
var fluidDrag = 0.0;  

private var fluidDensity = 1000.0;  
private var displacement = 0.0;  

private var myRenderer : Renderer;  
private var myRB : Rigidbody;  
private var myColliders : Array;  

private var timer = 0.0;  

function Start(){  
    var renderers = transform.root.gameObject.GetComponentsInChildren(Renderer);  
    var rendMax = Vector3(0,0,0);  
    for (var ren : Renderer in renderers){  
       if(ren.bounds.size.sqrMagnitude>rendMax.sqrMagnitude){  
          rendMax = ren.bounds.size;  
          myRenderer=ren;  
       }  
    }  
         
    if(myRB==null) myRB = GetComponent(Rigidbody);  
    if(myColliders==null) myColliders = GetComponentsInChildren(Collider);  
    for(var col : Collider in myColliders){  
       displacement += col.bounds.size.x*col.bounds.size.y*col.bounds.size.z;  
    }  
    displacement = displacement/divider;  
      
    if(airborneDrag<0)airborneDrag = myRB.drag;  
}  

function OnTriggerEnter(c : Collider){  
    if(c.tag=="fluid") myRB.drag=fluidDrag;  
      
}  
function OnTriggerStay(c : Collider){  
       if(myRenderer==null)return;  
       var timetemp = Time.realtimeSinceStartup;  
       if(c.tag=="fluid"){  
          var surfaceYPos = c.transform.position.y;  

          var bottom : Vector3 = transform.position;  

          for(var col : Collider in myColliders){  
             if(col==null) continue;  
             var temp = col.ClosestPointOnBounds(transform.position-Vector3(0,100,0));  
             if(temp.y<bottom.y) bottom = temp;  
          }  
                     
          var bottomToSurface : float = (surfaceYPos-bottom.y);  
            var bottomToCenter : float = (bottom - myRenderer.bounds.center).magnitude;  
            
           var pctSubmerged : float = Mathf.Clamp01(bottomToSurface/(bottomToCenter*2));  
          var force : Vector3 = displacement*fluidDensity*pctSubmerged*-1*Physics.gravity;  
          bottom = Vector3.Lerp(bottom,transform.position,0.75);  
          myRB.AddForceAtPosition(force,bottom);  
       }  
       timer += Time.realtimeSinceStartup-timetemp;  
}  

function OnTriggerExit(c : Collider){  
    if(c.tag=="fluid")   myRB.drag=airborneDrag;  
}  

Замедленое падение в воде


Фанат игр Max Payne и Fahrenheit.
 
СообщениеВообще стоит ждать версию 3.0, и надеяться, что в ней апгрейднут физику. а пока есть несколько различных решений по поводу воды:

Проект с физикой всплывания ГО
Страница с комментариями

Скрипт плавания:

Code

var density = 0.999;  
var airDens = 0.013;  
// In something like gram per cubic centimeter  
var flux : Vector3;  
var gravity = 9.81;  
var surfaceHeight = 0.0;  
var damper = 1.0;  
var thickness = 0.5;  
var normDrag = 0.0;  
var waterDrag = 0.99;  

function OnTriggerEnter (other : Collider) {  
    other.gameObject.SendMessage("YouSwim", true, SendMessageOptions.DontRequireReceiver);  
    other.gameObject.SendMessage("Water", transform, SendMessageOptions.DontRequireReceiver);  
    other.gameObject.SendMessage("Density", thickness, SendMessageOptions.DontRequireReceiver);  
}  

function OnTriggerStay (other : Collider) {  
    if (other.GetComponent(Rigidbody)) {  
       var size = other.bounds.size;  
       var volume : float = size.x*size.y*size.z;  
       var dens = other.rigidbody.mass/volume;  
       other.rigidbody.AddForce(transform.up * ((density-dens) * (surfaceHeight - other.transform.position.y) * damper / thickness - other.rigidbody.velocity.y/gravity) + flux/dens);  
       other.rigidbody.drag = waterDrag + (surfaceHeight - other.transform.position.y) * (waterDrag/gravity) + (0 - other.rigidbody.velocity.y) * (waterDrag/damper);  
       //other.rigidbody.AddTorque(Vector3.Slerp(other.rigidbody.angularVelocity, other.rigidbody.angularVelocity * -thickness, Time.deltaTime));  
       var colliders : Collider[] = Physics.OverlapSphere (other.transform.position, volume/(damper/dens*2));  
       for (var effect in colliders) {  
          if (effect.rigidbody && effect != other && effect.rigidbody.drag != 0.0) {  
             effect.rigidbody.AddForce(other.rigidbody.velocity * (damper/thickness) / effect.rigidbody.mass * Vector3.Normalize(other.rigidbody.velocity).magnitude * airDens);  
             var angl = (other.rigidbody.angularVelocity+other.rigidbody.velocity)/2;  
             effect.rigidbody.AddTorque(angl);  
          }  
       }  
    }  
}  

function OnTriggerExit (obj : Collider) {  
    other.gameObject.SendMessage("YouSwim", false, SendMessageOptions.DontRequireReceiver);  
    obj.rigidbody.drag = normDrag;  
}

Скрипт изменения гравитации

Скрипт покачивания в воде:

Code


// density here is killograms per cubic meter. Unity's world units are meters and mass is commonly assumed to be killograms  
   // Density of wood: 600 kg / cu.m  
   // Density of water 1000 kg / cu meter  
   // Density of iron 7000 kg / cu meter  
   // densityOfBody = b.mass / curBodiesVolume[i];  

var divider = 1.0;  

var airborneDrag = -1.0; //If left at -1 will use the Rigidbody Drag  
var fluidDrag = 0.0;  

private var fluidDensity = 1000.0;  
private var displacement = 0.0;  

private var myRenderer : Renderer;  
private var myRB : Rigidbody;  
private var myColliders : Array;  

private var timer = 0.0;  

function Start(){  
    var renderers = transform.root.gameObject.GetComponentsInChildren(Renderer);  
    var rendMax = Vector3(0,0,0);  
    for (var ren : Renderer in renderers){  
       if(ren.bounds.size.sqrMagnitude>rendMax.sqrMagnitude){  
          rendMax = ren.bounds.size;  
          myRenderer=ren;  
       }  
    }  
         
    if(myRB==null) myRB = GetComponent(Rigidbody);  
    if(myColliders==null) myColliders = GetComponentsInChildren(Collider);  
    for(var col : Collider in myColliders){  
       displacement += col.bounds.size.x*col.bounds.size.y*col.bounds.size.z;  
    }  
    displacement = displacement/divider;  
      
    if(airborneDrag<0)airborneDrag = myRB.drag;  
}  

function OnTriggerEnter(c : Collider){  
    if(c.tag=="fluid") myRB.drag=fluidDrag;  
      
}  
function OnTriggerStay(c : Collider){  
       if(myRenderer==null)return;  
       var timetemp = Time.realtimeSinceStartup;  
       if(c.tag=="fluid"){  
          var surfaceYPos = c.transform.position.y;  

          var bottom : Vector3 = transform.position;  

          for(var col : Collider in myColliders){  
             if(col==null) continue;  
             var temp = col.ClosestPointOnBounds(transform.position-Vector3(0,100,0));  
             if(temp.y<bottom.y) bottom = temp;  
          }  
                     
          var bottomToSurface : float = (surfaceYPos-bottom.y);  
            var bottomToCenter : float = (bottom - myRenderer.bounds.center).magnitude;  
            
           var pctSubmerged : float = Mathf.Clamp01(bottomToSurface/(bottomToCenter*2));  
          var force : Vector3 = displacement*fluidDensity*pctSubmerged*-1*Physics.gravity;  
          bottom = Vector3.Lerp(bottom,transform.position,0.75);  
          myRB.AddForceAtPosition(force,bottom);  
       }  
       timer += Time.realtimeSinceStartup-timetemp;  
}  

function OnTriggerExit(c : Collider){  
    if(c.tag=="fluid")   myRB.drag=airborneDrag;  
}  

Замедленое падение в воде


Автор - Скептик
Дата добавления - 20 Апр 2010 в 19:14
RealGamesWorldДата: Вт, 20 Апр 2010, 19:40 | Сообщение # 9
Карто-строитель
 
Сообщений: 190
Награды: 2
Репутация: 70
Статус: Offline
Так вот я и не пойму, где взять воду в стандарте, или где еще? у меня ни какой демки не было((
 
СообщениеТак вот я и не пойму, где взять воду в стандарте, или где еще? у меня ни какой демки не было((

Автор - RealGamesWorld
Дата добавления - 20 Апр 2010 в 19:40
DekterevДата: Вт, 20 Апр 2010, 19:50 | Сообщение # 10
 
Сообщений: 1753
Награды: 16
Репутация: 892
Статус: Offline
Quote (alec5sei)
у меня ни какой демки не было((

Демка тропического острова на сайте Unity.
Доступно только для пользователей


Поиск | Правила | Новые сообщения

Сообщение отредактировал Dekterev - Вт, 20 Апр 2010, 19:51
 
Сообщение
Quote (alec5sei)
у меня ни какой демки не было((

Демка тропического острова на сайте Unity.
Доступно только для пользователей


Автор - Dekterev
Дата добавления - 20 Апр 2010 в 19:50
RealGamesWorldДата: Ср, 21 Апр 2010, 12:24 | Сообщение # 11
Карто-строитель
 
Сообщений: 190
Награды: 2
Репутация: 70
Статус: Offline
Dekterev, а ты незнаешь где взять море из этой демки, когда за горы проходишь?
 
СообщениеDekterev, а ты незнаешь где взять море из этой демки, когда за горы проходишь?

Автор - RealGamesWorld
Дата добавления - 21 Апр 2010 в 12:24
ДенисДата: Ср, 21 Апр 2010, 12:41 | Сообщение # 12
 
Сообщений: 5098
Награды: 23
Репутация: 910
Статус: Offline
alec5sei, так ты сделал воду или нет?
Протестировал Стандарт Ассетс воду,все норм работает,вот скрин:
 
Сообщениеalec5sei, так ты сделал воду или нет?
Протестировал Стандарт Ассетс воду,все норм работает,вот скрин:

Автор - Денис
Дата добавления - 21 Апр 2010 в 12:41
СкептикДата: Ср, 21 Апр 2010, 14:05 | Сообщение # 13
Мыслитель
 
Сообщений: 5860
Награды: 48
Репутация: 1731
Статус: Offline
В стандартных Ассетах есть папка Water, см. там.

Фанат игр Max Payne и Fahrenheit.
 
СообщениеВ стандартных Ассетах есть папка Water, см. там.

Автор - Скептик
Дата добавления - 21 Апр 2010 в 14:05
GriffДата: Пн, 28 Июн 2010, 15:59 | Сообщение # 14
 
Сообщений: 2
Награды: 0
Репутация: 0
Статус: Offline
Притягиваю воду (Daylight Simple Water) на сцену. А она не прозрачная. Синяя. Как сделать воду прозрачной?

 
СообщениеПритягиваю воду (Daylight Simple Water) на сцену. А она не прозрачная. Синяя. Как сделать воду прозрачной?


Автор - Griff
Дата добавления - 28 Июн 2010 в 15:59
ЛевшаДата: Пн, 28 Июн 2010, 16:45 | Сообщение # 15
Черный Волк
 
Сообщений: 7257
Награды: 30
Репутация: 3313
Статус: Offline
Quote (Griff)
Как сделать воду прозрачной?

Шейдеры меняй.
На нашем сайте лежит урок по созданию реальной воды.


X.cor.R (Prologue)
 
Сообщение
Quote (Griff)
Как сделать воду прозрачной?

Шейдеры меняй.
На нашем сайте лежит урок по созданию реальной воды.

Автор - Левша
Дата добавления - 28 Июн 2010 в 16:45
Форум Игроделов » UNITY3D » ЛАНДШАФТ » Вода и всё, связанное с ней
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024