1 Востаннє редагувалося FakiNyan (10.01.2015 20:41:06)

Тема: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

Хайо. Кручу камеру от так. (насправді не камеру, а точку, в котру дивиться камера)

cameraAngleX-=mouseSpeedX/1000;
                    cameraAngleY+=mouseSpeedY/1000;

                    cameraRotX=(float)(Math.sin(cameraAngleX))+cameraPosX;
                    cameraRotY=(float)(Math.cos(cameraAngleY))+cameraPosY;

і якщо я постійно кручу вліво, наприклад, то вона ж має крутитись навколо себе, і врешті решт я маю дивитись в те саме місце, з якого починав, але ця гадюка довертає до кута, а потім йде назад, як на картинці
http://puu.sh/ejXlV/9dae12b609.png
чо так? пробував крутити предмет в Unity3D по цим самим формулам, і там все нормально.

2

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

Тому, що sin(x) та cos(x) - це відношення катетів до гіпотенузи, т.е. від 0 до 1
Посилання
При збільшенні кута, цикл починається знову.

3

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

Chemist-i написав:

Тому, що sin(x) та cos(x) - це відношення катетів до гіпотенузи, т.е. від 0 до 1
Посилання
При збільшенні кута, цикл починається знову.

якщо чесно, то я це й сам був зрозумів, коли глянув на графік y=sin(x).  Правда на графіку воно від -1 до 1. Біда в тому, що я не доганяю, як цю проблему вирішити. Думав ото, що може вся суть ховається в числі Пі! І коли X стає більшим за число Пі, то треба цей X онулити, і почати рахувати в іншу сторону. Тобто, послідовність має бути така
0, 1, 2, 3.14, 0 -1, -2, -3.14, 0, 1...
Що скажете?

4

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

Так, Ви праві від -1 до 1 (я помилився).
Пі - це просто інша міра кута, пі конвертується в градуси лінійно - Pi = 180 градусів, 2Pi відповідно 360 і так далі.
Як вирішити, треба розширити діапазон, щоб було не від 0 до 180, а від скажімо 0 до 360. Т.е. щоб -1 не виникало. Як подумайте, я думаю Ви здогадаєтесь.
upd
Представте це як коеф.

кут = величина * коеф;
коеф = sin(x) [-1..1] (а треба [0..1])

Щось таке.

5

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

в мене аж в пузі бурчить, щось зовсім не думається

6

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

Наведіть більш повний код.

7

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

я думав, ви скажете - то йди пожри!
я спочатку сам подумаю, а якщо не дожену, то дам код і все інше

8 Востаннє редагувалося HetmanNet (10.01.2015 19:25:48)

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

FakiNyan написав:

я думав, ви скажете - то йди пожри!
я спочатку сам подумаю, а якщо не дожену, то дам код і все інше

З Unity3D незнайомий, але нагадало одне завдання. Вступу не буде, буду притримуватися вашого стилю.

Беручи координати мишки з системи отримував позитивну площину, тобто коли X та Y набувають лише позитивних значень. У джойстика координати можуть набувати і від'ємних значень. Якщо створити віртуальний нуль для координат мишки, то отримаємо таку саму площину як у джойстика у відносних одиницях:

PosX = (MousePos.x-(Screen.width/2))/(Screen.width/2)
PosY = (MousePos.y-(Screen.height/2))/(Screen.height/2)

отримавши значення в межах -1:1. Далі переводимо у кут з урахуванням чуттєвості (від 1 до 0):

DegX = asin(PosX*SensitivityX)
DegY = asin(PosY*SensitivityY)

Тобто отримуємо значення в межах -90:90 при максимальній чуттєвості (1). Далі треба взяти попередні значення кутів і знайти нові:

OldDegX = NewDegX
NewDegX = asin(sin(OldDegX+DegX))
OldDegY = NewDegY
NewDegY = asin(sin(OldDegY+DegY))

А далі в залежності від обставин можна перевести у позитивний кут чи у трьохмірну координату якщо це переміщення камери навколо якоїсь точки на певній відстані чи ще щось.
Сподіваюся я зрозумів, що ви хочете чи наблизився. Хоча би скажіть чи вірний напрямок? Чи немає сенсу продовжувати описувати?

9

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

HetmanNet написав:
FakiNyan написав:

я думав, ви скажете - то йди пожри!
я спочатку сам подумаю, а якщо не дожену, то дам код і все інше

З Unity3D незнайомий, але нагадало одне завдання. Вступу не буде, буду притримуватися вашого стилю.

Беручи координати мишки з системи отримував позитивну площину, тобто коли X та Y набувають лише позитивних значень. У джойстика координати можуть набувати і від'ємних значень. Якщо створити віртуальний нуль для координат мишки, то отримаємо таку саму площину як у джойстика у відносних одиницях:

PosX = (MousePos.x-(Screen.width/2))/(Screen.width/2)
PosY = (MousePos.y-(Screen.height/2))/(Screen.height/2)

отримавши значення в межах -1:1. Далі переводимо у кут з урахуванням чуттєвості (від 1 до 0):

DegX = asin(PosX*SensitivityX)
DegY = asin(PosY*SensitivityY)

Тобто отримуємо значення в межах -90:90 при максимальній чуттєвості (1). Далі треба взяти попередні значення кутів і знайти нові:

OldDegX = NewDegX
NewDegX = asin(sin(OldDegX+DegX))
OldDegY = NewDegY
NewDegY = asin(sin(OldDegY+DegY))

А далі в залежності від обставин можна перевести у позитивний кут чи у трьохмірну координату якщо це переміщення камери навколо якоїсь точки на певній відстані чи ще щось.
Сподіваюся я зрозумів, що ви хочете чи наблизився. Хоча би скажіть чи вірний напрямок?

нехай вам хтось інший відповідає, я не розбираюсь в тригонометрії

10 Востаннє редагувалося FakiNyan (10.01.2015 19:31:19)

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

Chemist-i написав:

Так, Ви праві від -1 до 1 (я помилився).
Пі - це просто інша міра кута, пі конвертується в градуси лінійно - Pi = 180 градусів, 2Pi відповідно 360 і так далі.
Як вирішити, треба розширити діапазон, щоб було не від 0 до 180, а від скажімо 0 до 360. Т.е. щоб -1 не виникало. Як подумайте, я думаю Ви здогадаєтесь.
upd
Представте це як коеф.

кут = величина * коеф;
коеф = sin(x) [-1..1] (а треба [0..1])

Щось таке.

можу тупити, але, здається, вірно

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

http://puu.sh/ekIn9/de311a0643.png

UPD: і воно не крутить камеру на 360 градусів

11

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

Не х треба ділити (х - це кут, в градусах або радіанах, він може бути від -нескінченність  до  +нескінченність), ділити треба сін(х) на 2

[0..1]=(six(x)+0.5)/2;

12

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

Chemist-i написав:

Не х треба ділити (х - це кут, в градусах або радіанах, він може бути від -нескінченність  до  +нескінченність), ділити треба сін(х) на 2

[0..1]=(six(x)+0.5)/2;

наче так і роблю, нє?

cameraRotX=(float)(Math.sin(cameraAngleX)/2+0.5)+cameraPosX;
                    cameraRotY=(float)(Math.cos(cameraAngleY)/2+0.5)+cameraPosY;

13 Востаннє редагувалося FakiNyan (10.01.2015 19:40:07)

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

в мене є думка, зараз перевірю її
UDP: думка невірна。

14

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

не 0.5, а 1

[0..1]=(six(x)+1)/2;

як six(x) == -1 то у нас 0;
як six(x) == 1 то у нас 2/2 = 1;

15

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

Chemist-i написав:

не 0.5, а 1

[0..1]=(six(x)+1)/2;

як six(x) == -1 то у нас 0;
як six(x) == 1 то у нас 2/2 = 1;

так ви просто спочатку додаєте, а потім ділете, а в мене навпаки
тобто можна і як
(-1+1)/2=0
(0+1)/2=0,5
(1+1)/2=1
так і
(-1/2)+0.5=0
(0/2)+0.5=0.5
(1/2)+0.5=1

16 Востаннє редагувалося FakiNyan (10.01.2015 19:53:31)

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

здається, в мене сінус невірний
upd: чому на сайті пише
http://puu.sh/ekLGL/11388a52b2.png
а в мене ось це

Math.sin(90)

повертає 0.8939966636005579
p.s. маю думку, що біда в градусорадіанах

17 Востаннє редагувалося Chemist-i (10.01.2015 19:55:46)

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

FakiNyan написав:

здається, в мене сінус невірний

Перевірте, сінус може задаватись як градусами 0-360 так і радіанами (0-2pi), як переводити градуси в радіани розберетесь?
upd
Радіан

18

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

Chemist-i написав:
FakiNyan написав:

здається, в мене сінус невірний

Перевірте, сінус може задаватись як градусами 0-360 так і радіанами (0-2pi), як переводити градуси в радіани розберетесь?
upd
Радіан

він задається радіанами таки

Math.sin(Math.toRadians(cameraAngleX))

19

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

вирішив вас потішити, і зробив по вашій формулі

 cameraRotX=(float)(Math.sin(Math.toRadians(cameraAngleX))+1)/2+cameraPosX;
                    cameraRotY=(float)(Math.cos(Math.toRadians(cameraAngleY))+1)/2+cameraPosY;

нічо не змінилось, бо по суті на виході ми маємо те саме, від 0 до 1, просто задаємо це все радіанами

20

Re: Чому камера крутиться тільки в межах 180 градусів? [ВИРІШЕНО]

А що маємо мати на виході?