Rotate 3D Camera By Touch Drag

0 favourites
  • 9 posts
From the Asset Store
Simple and easily editable template for a dynamic camera that zooms in and out based on how far apart the players are.
  • THE SETUP

    The 3D Camera is going to be set behind a central figure in the center of an arena. The Player will tap-hold and swipe left/right to rotate the central figure and thus the Camera behind it, giving a 3rd-person perspective.

    The 3D Camera is set to "Up Vector Z = 1".

    WHAT I'M TRYING TO DO

    When the Player holds a Touch on the screen (on the left side of the overall viewport), dragging X pixels left or right will rotate the 3D Camera smoothly a given number of angles. I believe Lerp( ) will be applied here. The idea being that for every X pixels that the Player drags their Touch along the X axis (relative to the viewport and not the layout), the central figure will rotate, too (the Camera with it via Pin). So, if one pixel to the left means rotating 10° clockwise, dragging Touch 10 pixels to the right means rotating 100° counter-clockwise (these numbers will obviously have to be adjusted).

    If needed, the Player removes their Touch, then Touches the screen again and drags to rotate the Camera.

    WHAT I HAVE SO FAR

    Hopefully this saves a LOT of writing and explains everything so far... I can clarify in the comments if need be.

    WHAT I'M HAVING TROUBLE WITH

    At the moment, I'm relatively having success with setting the variables and getting the results I want. Relatively...because I just realized that I'm getting Touch.X (or Touch.AbsoluteX) values according to the canvas. The 3D Camera, at start-up, is angled to the far-left of the layout. So, when I Touch the screen, the X values end up being updated as I drag Touch up and down (again, because of the angle of the Camera).

    What I want it to do is update the Touch X value as I drag across the screen, itself. Regardless of the facing angle of the Camera or visual orientation of the layout, I want the X value of the Touch according to the viewport.

    The TouchInterface layer is set to a 0%x0% parallax and 2D rendering. I believe that's the proper settings...I could be wrong.

    I am not sure what else to try at the moment.

    Thank you for your help.

  • Instead of touch.x which grabs the coordinates from the bottom layer you can use touch.x("TouchInderface") to get it from the specific 2d layer.

    That should solve the touch coordinates issue I think.

  • Instead of touch.x which grabs the coordinates from the bottom layer you can use touch.x("TouchInderface") to get it from the specific 2d layer.

    YUP! That did the trick! I completely forgot that you could do [object].X( [layer] ).

    NOW! Onward to my next conundrum!! (It'll be here sooner than I think, I'm sure!)

  • R0J0hound

    Okay! That didn't take long. The specific issue you helped me with did work. But, new problem...and, seriously, I just don't get why this isn't working. I'm still a noob to the Touch-related matters of C3 (always have been since C2) but I thought this was straight-forward enough.

    Per the screenshot...

    LINE 3

    Check when a Touch has initiated and make sure it's on the left-side of the screen. Ensure the global variable Touch_ID is -1. This is to restrict movement controls to one side of the screen. (Controls on the right side need only register a tap...but that's for later.)

    If true, set the TouchXBase variable to the initial Touch.X([layer]) as this will determine how much to rotate the camera through dragging. Set Touch_ID to the Touch.TouchID value as this is the specific Touch ID value that needs to be constantly checked for while dragging is still true.

    (Get the Podium object's angle stored...but that's not important now.)

    LINE 4

    If Touch is active and it's on the left-side of the screen and that Touch ID value matches Touch_ID variable, then update the TouchDifference variable. The difference between Touch.X([layer]) and TouchXBase will be used to determine how much to rotate the Camera.

    LINE 5

    When the Touch of ID value Touch_ID comes to an end, then set Touch_ID to -1 so it's ready for the next control input from a Touch on the left-side of the screen.

    WHEW! I hope that all made sense.

    PROBLEM!!

    When I run it in debug, Touch_ID updates to a value of 1 and TouchXBase updates to whatever Touch.X([layer]) X value is. Everything works up to that point. What doesn't work are the events on Lines 4 and 5. TouchDifference doesn't update and it doesn't register when the Touch.TouchID ends.

    Upon testing the Touch object in debug, I did confirm that it registers an active/held touch (mouse click and hold) and that instance of a touch ends when I release the mouse button. So, something is getting lost in the mix starting at Line 4.

    I'll keep at it while I wait for your reply. Thanks again as always!

  • Personally I’d say just go for a simpler interaction with touch.

    Var startX=0
    
    On touch
    — set startX to touch.x
    
    Is touching
    — rotate by startx-touch.x
    — set startX to touch.x

    Which works great if you only have one touch at once.

    The touch id stuff is only useful when you are dealing with multiple touches. Each distinct touch will have its own unique id.

    Fastest way to get an example of how to use one of the bundled examples.

    But off the top of my head you’d get the id when the touch starts, then use the id to reference that touch, and finally unset the variable when that Touch ID releases.

    Var myid=-1
    
    On touch
    Myid=-1
    — set myid to touch.id
    
    Touch: id myid is in touch
    — do something
    
    On touch released
    Touch.id = myid
    — set myid to -1
  • R0J0hound And that's what I thought I was doing.

    I disabled the "while in touch" line so that there's only "On Touch Start" and "One Touch End", calling on the TouchID value. Touch Start works... Touch End never registers.

  • R0J0hound

    I tried to isolate the problem further...

    I set it so that it checks if any Touch ends then set the Touch_ID value to -1 (I made the initial value of Touch_ID to be 0 in this test).

    This basically ignores the On Touch condition for now.

    And...it worked. So, my novice understanding of things leaves me with a couple of conclusions:

    1. On Nth Touch Ends is failing to register or recognize the value sent to it (via Touch_ID).

    2. It has something to do with the fact that the Nth Touch is being held (remains in touch for a time) before it later comes to an end and so On Nth Touch Ends spazzes.

    Shall I submit this as a bug? What do you suppose?

  • Try Construct 3

    Develop games in your browser. Powerful, performant & highly capable.

    Try Now Construct 3 users don't see these ads
  • I still think it would be helpful to look at the touch examples for working demonstration of use. Your screenshot shows one thing and you talk about different things. It’s probably a bug with your events, not a bug with the plugin.

    I will say that a Touch ID is different than getting the nth touch

  • Excuse me while I gaze in dumbfounded awe at the lightbulb that just went on above my head.

    Touch ID VS Nth Touch.

    ...it suddenly dawns on me that these are, in fact, as you just said, two different things. I just assumed they were the same. That the Nth Touch is its ID. That would explain why I was having trouble.

    I honestly did take a look at several of the Touch examples before I even got to work but I couldn't find what I was looking for in the available examples - it's possible I didn't look enough or didn't know which one to look at. Anyway... I will keep that in mind when I later implement Touch in my project. Things are working now as I have them but I'm not done yet with my Touch controls...

    I'm quite certain now that you're correct about it being a bug in my events.

    Thanks for your time and patience!

Jump to:
Active Users
There are 1 visitors browsing this topic (0 users and 1 guests)