Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
2
Question by Richard 3 · Mar 22, 2011 at 12:21 PM · androidcameratransformangletilt

Link Input.acceleration to camera

I am building a tilt type game based on the Roller Ball tutorial. I have a camera which "smooth" follows the ball. My problem is tilting of the phone is linked to the stage not the camera. If the camera rotates 180 around the ball the tilt controls are opposite, tilt left and the ball moves to the right. The tilt doesn't update with the camera. This makes control of the ball imposable.

How can I have the tilting linked to the camera view and not the scene.

Here is the code

public var force:float = 1.0; public var simulateAccelerometer:boolean = false;

function FixedUpdate () {

print camera.transform.rotation();

var dir : Vector3 = Vector3.zero;

if (simulateAccelerometer) { // using joystick input instead of iPhone accelerometer dir.x = Input.GetAxis("Horizontal"); dir.z = Input.GetAxis("Vertical"); } else { // 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.y;
 dir.z = Input.acceleration.x;

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

}

rigidbody.AddForce(dir * force); }

Thanks

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

2 Replies

· Add your reply
  • Sort: 
avatar image
3
Best Answer

Answer by Statement · Apr 04, 2011 at 01:12 PM

Try to transform the input direction relative to the camera:

 dir = Camera.main.transform.TransformDirection(dir);
 rigidbody.AddForce(dir * force);


Alternatively if you want to ignore any height slope:

var lookAt = transform.position - Camera.main.transform.position; lookAt.y = 0;

var rotation = Quaternion.LookRotation(lookAt); rigidbody.AddForce(rotation dir force);


// Complete test script that I successfully tested with. var force = 5.0f; function FixedUpdate () { var dir : Vector3 = Vector3.zero; dir.x = Input.GetAxis("Horizontal"); dir.z = Input.GetAxis("Vertical");

 var lookAt = transform.position - Camera.main.transform.position;
     lookAt.y = 0;

 var rotation = Quaternion.LookRotation(lookAt);
 rigidbody.AddForce(rotation * dir * force);

}

Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Richard 3 · Apr 05, 2011 at 06:44 AM 0
Share

Thanks, perfect.

avatar image
2

Answer by McBuff · Mar 22, 2011 at 12:56 PM

So you have ported the tilting over to the unity scene? Then you're halfway there.

Right now your tilt is registered in World coordinates ( the coordinates relative to (0,0,0) of your scene).

I assume you know what is causing your problem so yo need to know how the phone is tilted relative to the camera.

That means you need to convert the tilt of the phone from being relative to the scene to being relative to your camera ( local coordinates).

This might seem complex but it's actually pretty easy to implement.

First, get yourself the transform component of your camera.

get the transform's WorldToLocal Matrix. ( no worries, you don't need to understand how it works ). Then multiply your tilt VECTOR with the matrix.

You'll end up with something like this.

Transform cameraTransform; //todo: get camera transform Vector3 dir = Vector3.zero; dir.x = -Input.acceleration.y; dir.z = Input.acceleration.x;

Matrix4x4 worldToLocal = cameraTransform.worldToLocalMatrix; Vector3 localTilt = worldToLocal.MultiplyVector(dir);

localtilt will now contain a tilt value that is relative to your camera position & angle.

Hope this helps!

Comment
Add comment · Show 3 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Richard 3 · Mar 23, 2011 at 09:35 AM 0
Share

Thanks for this, but I am getting an error on these lines: "Assets/Scripts/Controller2.js(30,18): UCE0001: ';' expected. Insert a semicolon at the end. on these two lines: $$anonymous$$atrix4x4 worldToLocal = cameraTransform.worldToLocal$$anonymous$$atrix; and Vector3 localTilt = worldToLocal.$$anonymous$$ultiplyVector(dir); Richard 0 secs ago

avatar image Statement · Apr 04, 2011 at 01:14 PM 0
Share

That's because it is C# code $$anonymous$$cBuff posted.

avatar image abhishakverma · Jan 17, 2014 at 03:47 AM 0
Share

If you make a complete script for device.it really helpful for us. Thanks

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

1 Person is following this question.

avatar image

Related Questions

How do I get an Unity Camera to interact with an Android camera compas funtion 1 Answer

GearVR rotation stutter InputTracking.GetNodeStates 1 Answer

Move to touch position 1 Answer

getting the position of player for the minimap to follow 1 Answer

Top down shooter, large scale jitter problem. 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges