1

Тема: Відносний рух камери та інше

Хай. Дуже комплекса проблема. Постараюсь зрозуміло пояснити, що вимагається.
Є кораблик літающий мій. Є камера, котрій присвоюється позиція цього корабля, і таким чином корабль знаходиться завжди посередині єкрану. Треба зробити так, аби при русі, наприклад, вліво, камера змінювала свою позиції таким чином, аби кораблик відображався біля правого краю екрану. Ця картинка пояснює, в котру сторону рухається корабль, і де він має знаходитись на екрані.

Прихований текст

http://puu.sh/a7Vw8/969671d4f6.png

Які дані ми маємо?
1) Вектор руху корабля, він являє собою швидкість корабля та сторону, в котру він летить, тобто швидкість корабля ми маємо, і сторону ми теж можемо дізнатись
2) Трансформація кооридат ігрового світу та координат екрану, тобто ми можемо взяти розмір екрану, в мене це 1600х900, і перевести точку 0х900 (вона відповідає нижньому лівому куту екрана) в координати ігрового світу, таким чином ми можемо рухати корабль відносно екрану, або дізнатись, чи знаходиться корабль в межах екрану
Зараз я зробив от так
http://webplayerbuild.ru/view.php?id=148147
Тут я спочатку присвоюю координати корабля камері, а потім ще додаю до координат камери вектор швидкості корабля, таким чином камера зміщується в ту сторону, в котру летить корабль. І відстань, на котру зміщується камера залежить від швидкості руху корабля. Але як бачите, камера дуже сильно зміщується і корабель зникає з поля зору камери, як зробити так, аби він не зникав?
ну ви зрозуміли, ага?

2

Re: Відносний рух камери та інше

Покажіть формули, якими ви обчислюєте зміщення.

3

Re: Відносний рух камери та інше

koala написав:

Покажіть формули, якими ви обчислюєте зміщення.

 cameraTemp = (Vector2)myTransform.position + rigidbody2D.velocity * 0.618033f;
        cameraTemp.z = -10;
        mainCamera.position = cameraTemp;

4 Востаннє редагувалося koala (13.07.2014 00:05:56)

Re: Відносний рух камери та інше

myTransform.position - положення корабля, а rigidbody2D.velocity - його швидкість, я правильно зрозумів? Просто визначайте максимальний зсув і не зсувайте більш ніж на нього, десь так:

double maxShift = Math.Min( rigidbody2D.velocity.magnitude(), 100 );
cameraTemp = (Vector2)myTransform.position + rigidbody2D.velocity.normalized() * maxShift * 0.618033f;

double і 100 взяв зі стелі, не знаю, в яких одиницях у вас воно обчислюється.
Звісно, if-ами буде швидше (уникаємо зайвих обчислень), але так формули чіткіші.
А до чого там золотий перетин і чому з такою низькою точністю?

5

Re: Відносний рух камери та інше

koala написав:

myTransform.position - положення корабля, а rigidbody2D.velocity - його швидкість, я правильно зрозумів? Просто визначайте максимальний зсув і не зсувайте більш ніж на нього, десь так:

double maxShift = Math.Min( rigidbody2D.velocity.magnitude(), 100 );
cameraTemp = (Vector2)myTransform.position + rigidbody2D.velocity.normalized() * maxShift * 0.618033f;

double і 100 взяв зі стелі, не знаю, в яких одиницях у вас воно обчислюється.
Звісно, if-ами буде швидше (уникаємо зайвих обчислень), але так формули чіткіші.
А до чого там золотий перетин і чому з такою низькою точністю?

то мені пан bunyk таке число дав xD
я ж не зовсім довбень і про той макс. зсув давно вже подумав, але екран же не круглий, і в залежності від напрямку руху корабля зсув буде відрізнятись

Прихований текст

http://puu.sh/a8BVE/03f4de803d.jpg

тут треба на основі розмірів екрану і кута визначати отой максимальний зсув

Прихований текст

http://puu.sh/a8Cil/08d6ed7800.jpg

6

Re: Відносний рух камери та інше

Тоді просто розкладайте на координати:

cameraTemp.x = ((Vector2)myTransform.position).x + Math.Min(rigidbody2D.velocity.x, 100);
cameraTemp.y = ((Vector2)myTransform.position).y + Math.Min(rigidbody2D.velocity.y, 120);

100 і 120 - половинки екрану, не знаю, як вони визначаються у вас там.

7 Востаннє редагувалося FakiNyan (13.07.2014 13:10:47)

Re: Відносний рух камери та інше

koala написав:

Тоді просто розкладайте на координати:

cameraTemp.x = ((Vector2)myTransform.position).x + Math.Min(rigidbody2D.velocity.x, 100);
cameraTemp.y = ((Vector2)myTransform.position).y + Math.Min(rigidbody2D.velocity.y, 120);

100 і 120 - половинки екрану, не знаю, як вони визначаються у вас там.

ой, ну зара спробую

Прихований текст

Screen.width/2 & Screen.height/2

8 Востаннє редагувалося FakiNyan (13.07.2014 13:36:16)

Re: Відносний рух камери та інше

працює хД але тільки для ліва і низу, як зробити, щоб працювало і при від'ємному значенні velocity?
http://webplayerbuild.ru/view.php?id=226537

Прихований текст

в мене теж була ідея, зробити так, як ви кажете, але трохи іншим шляхом, спочатку я створював нову точку для камери, а потім перевіряв, чи буде видно корабель в камері, якщо присвоїти позиції камери ту точку, але воно якось погано працювало, корабель дьоргався біля країв камери, ну то таке

9

Re: Відносний рух камери та інше

Додайте пару if-ів, бо як формулою напишу, мало не буде :)

10

Re: Відносний рух камери та інше

koala написав:

Додайте пару if-ів, бо як формулою напишу, мало не буде :)

ну я зробив от так, але шось не працює

 cameraTemp.x = myTransform.position.x + Math.Min(Math.Abs(rigidbody2D.velocity.x), screenWidthToWorld/2f);
        if (rigidbody2D.velocity.x < 0)
        {
            cameraTemp.x *= -1;
        }
        cameraTemp.y = myTransform.position.y + Math.Min(Math.Abs(rigidbody2D.velocity.y), screenHeightToWorld / 2f);
        if (rigidbody2D.velocity.y < 0)
        {
            cameraTemp.y *= -1;
        }
        cameraTemp.z = -10;
        mainCamera.position = cameraTemp;

11

Re: Відносний рух камери та інше

FakiNyan написав:

шось не працює

ну то шось зробіть

Подякували: quez1

12

Re: Відносний рух камери та інше

перебирав декілька варіантів, котрі здавалися логічними і такими, що мають працювати, але вони не працювали =( зупинився на цьому, він працює

    tempRigidbody2D = rigidbody2D.velocity*0.7f;

        if (rigidbody2D.velocity.x<0)
        {
            cameraTemp.x = myTransform.position.x + Math.Max(tempRigidbody2D.x, -screenWidthToWorld / 2f);
        }
        else
        {
            cameraTemp.x = myTransform.position.x + Math.Min(tempRigidbody2D.x, screenWidthToWorld / 2f);
        }
        if (rigidbody2D.velocity.y < 0)
        {
            cameraTemp.y = myTransform.position.y + Math.Max(tempRigidbody2D.y, -screenHeightToWorld / 2f);
        }
        else
        {
            cameraTemp.y = myTransform.position.y + Math.Min(tempRigidbody2D.y, screenHeightToWorld / 2f);
        }

13 Востаннє редагувалося koala (13.07.2014 19:47:39)

Re: Відносний рух камери та інше

cameraTemp.x = myTransform.position.x + 
    Math.Sign( rigidbody2D.velocity.x ) * 
    Math.Min( Math.Abs( rigidbody2D.velocity.x ), screenWidthToWorld / 2f );
cameraTemp.y = myTransform.position.y + 
    Math.Sign( rigidbody2D.velocity.y ) * 
    Math.Min( Math.Abs( rigidbody2D.velocity.y ), screenHeightToWorld / 2f);

На майбутнє:
( a + b ) * ( -1 ) != a - b

14

Re: Відносний рух камери та інше

стоп, щось я не можу наздогнати різниці. Нехай буде так

cameraTemp.x = 10 + (-1)*Math.Min(Math.Abs(-15),200);

і тут у нас буде 10-15=-5
А в мене

cameraTemp.x = 10 + Math.Min(Math.Abs(-15),200); // буде 25

а потім я його домножав на -1 хД  тепер все зрозуміло
Чесно кажучи сьоня день якийсь такий, шо спав до 14, і взагалі не можу сконцентруватись, тому я навіть не розбирався з цим всім, але хотілось зробити, тому методом тику щось зробив, ех