forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Программирование для мобильных устройств (http://forum.boolean.name/forumdisplay.php?f=173)
-   -   Связь с акселерометром (http://forum.boolean.name/showthread.php?t=17010)

DeKon 08.07.2012 19:25

Связь с акселерометром
 
Здравствуйте! Возникла необходимость написать простенькое приложение на андройд. Решил использовать Юнити. Нужно лишь зависимость камеры от акселерометра, двигаться не надо. Сам я не владею ни С++ ни Ява скриптом (знаком только с паскалем:) ) из-за этого возникают проблемы. На сайте Юнити нашел инфу, как сделать связь с акс.
Возникли две проблемы:
1) Начальная позиция на оси Х - телефон параллелен полу, а мне нужно, что бы начальная позиция была когда телефон перпендикулярен полу. Перепробовал разные способы, которые смог придумать, но при них камера просто постоянно крутилась по оси Х
2) Так как я двигаю телефон только по осям Х и У, мне и нужно получить в итоге движение по ним. Камера отлично слушается, но почему то начинает крутиться и по оси Z. Никак не могу заморозить этот параметр.
Скрипт и скриншот прилагаются, просьба сильно тапками не бить за извращенные методы.

// Move object using accelerometer
var speed = 10;
var dir : Vector3 = Vector3.zero;

function Update () {


// we assume that device is held parallel to the ground
// and Home button is in the right hand

// remap device acceleration axis to game coordinates:
// 1) XY plane of the device is mapped onto XZ plane
// 2) rotated 90 degrees around Y axis



dir.x = Input.acceleration.x;
dir.y = -Input.acceleration.y;




// clamp acceleration vector to unit sphere
if (dir.sqrMagnitude > 1)
dir.Normalize();

// Make it move 10 meters per second instead of 10 meters per frame...
dir *= Time.deltaTime;

// Move object


transform.Rotate (dir * speed * 10);


}



pax 08.07.2012 20:01

Ответ: Связь с акселерометром
 
Задачу опиши нормально.
1) попробуй использовать Input.acceleration.z вместо x
2) вращение вероятно можно выполнить как transform.eulerAngles += dir * speed * 10;

DeKon 08.07.2012 21:11

Ответ: Связь с акселерометром
 
Во! Отлично! То что нужно. Спасибо.

DeKon 08.07.2012 22:44

Ответ: Связь с акселерометром (теперь еще вопрос по скрипту)
 
А такой еще вопрос. Для большей реалистичности решил все-таки добавить небольшой наклон по оси Z. Но нужно сделать так, что бы, наклонив телефон достаточно сильно, камера поворачивалась по оси Z (например как наклон головой вправо-влево), а при стандартом положении наклон возвращался в стандартное положение ( то есть 0) и оставался таким.
Создав новый скрипт, я анимировал наклон по оси Z при определенном наклоне телефона, но не знаю, что надо использовать, что бы при стандартном положении телефона значение наклона от текущего значения возвращалось к нулю и оставалось таким.
// Move object using accelerometer

var speed = 10;
var dir : Vector3 = Vector3.zero;

function Update () {

dir.z= Input.acceleration.y;
if (dir.sqrMagnitude > 1)
dir.Normalize();

// Make it move 10 meters per second instead of 10 meters per frame...
dir *= Time.deltaTime;

//модуль он у меня почему-то не принял, наверно библиотеку какую-то надо добавить

if (dir.z > 0.0015)
transform.Rotate (dir* speed* 6);
else if (dir.z < -0.0015)
transform.Rotate (dir* speed* 6);
else //что сюда добавить, что бы он от текущего значения возвращался к нулю и оставался таким?//



}

pax 09.07.2012 09:22

Ответ: Связь с акселерометром (теперь еще вопрос по скрипту)
 
В общем сейчас ты работаешь с абстрактным вращением, я даже не знаю как лучше... попробуй как-то так:
PHP код:

if (Mathf.Abs(dir.z) > 0.0015
       
transform.Rotate (dirspeed6); 
    else 
    {
         if (
transform.eulerAngles.speed 6
            
transform.eulerAngles.-= speed 6;
         else if (
transform.eulerAngles.< -speed6
            
transform.eulerAngles.+= speed 6;
         else 
            
transform.eulerAngles.0;
    } 


DeKon 09.07.2012 21:10

Ответ: Связь с акселерометром (теперь еще вопрос по скрипту)
 
Камера не реагировала на такое условие, проанализировав данные с акселерометра и камеры, сделал такое условие
PHP код:

if (Mathf.Abs(dir.z) > 0.0015)  
       
transform.Rotate (dirspeed6);  
   else   
    {  if (
transform.eulerAngles.2
           
transform.eulerAngles.=0;
       else if (
transform.eulerAngles.<100
               
transform.eulerAngles.-= 1.3;   
            else 
transform.eulerAngles.+= 1.3;
         
    } 

В целом камера слушается норм, но пока все довольно чувствительно и коряво,делаю мертвые зоны и т.д. калибрую в общем


Часовой пояс GMT +4, время: 08:55.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot