Rotation
이제 display object를 회전시키는 기능을 적용하겠습니다. 기본적인 로직은 midpoint 주위로 각각의 tracking dot 이 얼마나 ratate 되었느냐를 판단하는것부터 시작해야 할 겁니다. 그 평균을 구해서 object 의 이전 .rotation 값에 그 차이를 더해 주어야겠죠. 이것을 하려면 이것을 계산하는 함수들을 몇개 더 추가 해야 겠네요.
왜냐하면 angle 을 계산하려면 특정 수학 공식을 대입해야 하거든요. 그리고 원 둘레의 두 포인트 사이의 가장 작은 angle 을 구하는 작업도 필요합니다. 이것은 tracking dot 이 회전한 것에 대한 angle 을 사용할 때 아주 중요하게 사용됩니다. 잘못하면 작은 각도 말고 큰 각도를 사용할 수 있거든요. 90도와 260도가 있다면 우리가 필요한 것은 90도 입니다.
sample9.lua
-- returns the degrees between (0,0) and pt (note: 0 degrees is 'east')function angleOfPoint( pt )local x, y = pt.x, pt.ylocal radian = math.atan2(y,x)local angle = radian*180/math.piif angle < 0 then angle = 360 + angle endreturn angleend-- returns the degrees between two points (note: 0 degrees is 'east')function angleBetweenPoints( a, b )local x, y = b.x - a.x, b.y - a.yreturn angleOfPoint( { x=x, y=y } )end-- returns the smallest angle between the two angles-- ie: the difference between the two angles via the shortest distancefunction smallestAngleDiff( target, source )local a = target - sourceif (a > 180) thena = a - 360elseif (a < -180) thena = a + 360endreturn aend
calcAvgScaling 함수에서 했던 것처럼 모든 tracking dot들이 midpoint 주위를 회전한 것에 대한 평균 값을 구하기 위해 calcAvgRotation 함수를 사용하고 그 안에서 위의 함수들을 사용할 겁니다. 그리고 tracking dot 각도들 사이의 차이들도 update 해야 합니다. 그리고 직전 각도들도 마찬가지구요. 다행히 midpoint 로부터의 거리와 관련해서는 이미 구현해 놨었습니다. 약간의 코드만 추가하면 될 것 같습니다.
-- calculates rotation amount based on the average change in tracking point rotationlocal function calcAverageRotation( points )local total = 0for i=1, #points dolocal point = points[i]total = total + smallestAngleDiff( point.angle, point.prevAngle )endreturn total / #pointsend-- calculate each tracking dot's distance and angle from the midpointlocal function updateTracking( centre, points )for i=1, #points dolocal point = points[i]point.prevAngle = point.anglepoint.prevDistance = point.distancepoint.angle = angleBetweenPoints( centre, point )point.distance = lengthOf( centre, point )endend
이제 이 약간의 코드를 추가함으로서 rect:touch() 함수는 이미 began 과 ended phases 에 해당 값들을 업데이트 하게 되었습니다. 이제 우리가 해야 할 일은 moved phase 안의 “rect” display object에 rotation 을 적용하는 것 뿐입니다. 이 기능은 tracking dot 이 하나 이상일 때에 적용되는 기능입니다. 이제 tracking dot들의 midpoint 주위의 회전값 평균을 계산하고 이 object 에 적용하기 위해 위의 함수들을 call 하기만 하면 됩니다.
-- if there is more than one tracking dot, calculate the rotation and scalingif (#rect.dots > 1) then-- calculate the average rotation of the tracking dotsrotate = calcAverageRotation( rect.dots )-- calculate the average scaling of the tracking dotsscale = calcAverageScaling( rect.dots )-- apply rotation to rectrect.rotation = rect.rotation + rotate-- apply scaling to rectrect.xScale, rect.yScale = rect.xScale * scale, rect.yScale * scaleend
'Corona SDK > Corona Doc' 카테고리의 다른 글
iOS Build-in 트위터 기능 사용하기 (0) | 2013.02.20 |
---|---|
iOS 에서 이메일 첨부파일 사용하기 (0) | 2013.02.19 |
멀티 터치 지원하는 모양 맞추기 앱 개발하기 (2) | 2013.02.15 |
Pinch Zoom Rotate 구현하기 - 11/11 - (0) | 2013.02.14 |
Pinch Zoom Rotate 구현하기 - 10/11 - (0) | 2013.02.14 |
Pinch Zoom Rotate 구현하기 - 8/11 - (0) | 2013.02.14 |
Pinch Zoom Rotate 구현하기 - 7/11 - (0) | 2013.02.12 |
Pinch Zoom Rotate 구현하기 - 6/11 - (0) | 2013.02.12 |
Pinch Zoom Rotate 구현하기 - 5/11 - (0) | 2013.02.09 |
Pinch Zoom Rotate 구현하기 - 4/11 - (0) | 2013.02.01 |