사진/360 파노라마

KRPANO 액션 작성법

하늘이푸른오늘 2012. 9. 9. 00:22

krpano에는 작고 간단하면서도 동적인 스크립트 언어가 있습니다. 이를 사용하면 krpano를 여러가지 방법으로 변경할 수 있습니다. krpano의 명령 혹은 함수는 action이라고 합니다. 기존의 액션을 사용하여 새로운 액션을 제작하는 것도 가능합니다. 


스크립트 언어는 동적이며, 기본적으로 일부 기정의된 변수를 제외하면 무유형(untyped)이지만, 액션 내부에서 타입이 자동 변환되기 때문에 거의 대부분 문제가 없습니다.


KRPANO 전역변수


  • version(RO)(예: "1.0.8.15", xmlversion(RO), build(RO) (예: "2012-8-10")
  • mouse.x, mouse.y, mouse.stagex, mouse.stagey  /(RO)* mouse.x/y는 현 area에 대한 상대좌표. */
  • keycode(RO)  /* onkeydown, onkeyup 이벤트에서 설정됨. 
  • wheeldelta(RO) /* 마우스휠 돌아간 양, onmousewheel 이벤트에서 설정됨 
  • fullscreen  /* 풀스크린상태. 설정하면 상태가 바뀜. 단, 마우스/키보드 액션이 있을때만 가능. 즉, onclick="set(fullscreen, true);" onkeydown="swtich(fullscree);" 등만 가능.
  • stagex, stagey(RO) /* 현재 윈도의 크기. onresize 때 크기를 알아낼때 사용
  • browser.useragent
  • isflash, ishtml5, ismobile, istablet, isdesktop(RO), ... 
  • timertick(RO)       /* 뷰어가 시작된 이후의 시간. miliseconds. */
  • random(RO) /* 0.0-1.0사이. 1-10까지 만들려면, mul(val, random, 9); add(val, 1); roundval(val);
  • hlookat_moveforce, vlookat_moveforce, fov_moveforce /* 0이 아닌 값으로 설정하면, 가속(keybaccelerate) 되어 최고속도(keybspeed)가 되면 다시 0.0으로 설정되고 감속(keybfriction)됨 */
  • multireslevel(RO)  /* 현재의 level */
  • lockmultireslevel   /* "current"이면 현재의 레벨로, "3"이면 3레벨로 고정. "-1"이면 고정 해제 */
  • downloadlockedlevel 
  • xml.url(RO)          /* 현재 xml파일의 경로 */
  • xml.content(RO)   /* xml 파일에 들어있는 전체 내용 */
  • xml.scene(RO)    /* 현재 scene의 이름 */
  • lasterror             /* 마지막 에러 */
  • haveexternalinterface  /* local에서 Flash/javascript를 실행시킬 수 있는지? */
  • havenetworkaccess  /* 


Actions


  • set(variable, value) /* variable :=value. variable이 없으면 만들어짐. 다른 변수를 복사해 넣으려면 set(variable1, get(variable2)); 로 써야 함.
  • get(variable)          /* 다른 action에 variable을 넘겨줄때나, array[]에서 사용해야 할 때
  • copy(dest, source)  /* set(dest, get(source)); 와 동일함
  • delete(...variables...) 
  • if (condition, then_action, else_action) ifnot (condition, then_action, else_action)      /* condition이 true, not 0, not null 이면 then_action 실행됨.   cond1 OPERATOR cond2. 관계연산자로는 ==, !=, </LT, GT, LE, GE, ===,!== (존재할 때만 비교)
  • action(actionname, parameters...) / actionname(parameters...)로 써도 가능. 매개변수는 'parameter'도 가능하고 "parameter" 도 가능
  • delayedcall(delay, action)  /* delay 초 후에 action 실행
  • for(startaction, condition, nextaction, loopaction), asyncfor(startaction, condition, nextaction, loopaction) /* startaction -> condition 체크 -> loopaction -> nextaction -> condition 체크 ->... 일반 for의 경우에는 for가 완료되어야 그 다음 문장이 실행됨. async의 경우 for를 한번 통과하고나서 다음문장을 계속실행. for의 loop action은 한 frame에 한번씩 수행됨*/
  • loop(condition, loopaction), asyncloop(condition, loopaction) /* condition check -> loopaction */
  • switch(variable, valueA*, valueB*,..) /* switch(variable)이면, 실행될때마다 variable이 true/false를 반복함. switch(variable, 3, 4, 7) 이라면 첫번째는 3 두번째는 4, 세번째는 7, 네번째는 3 등으로 계속 반복 */
  • push(variable), pop(variable) /* variable을 stack에 저장/불러옴 */
  • stopall() /* 현재 수행중인 actions, tween 정지. queueed action 제거 */
  • breakall() /* 현재 수행중인 actions, tween 정지. queued action 수행 */
  • add/sub/mul/div/mod/pow(variable, valueA, valueB) /* 파라미터가 두개일 경우, sub(A, B)는 A=A-B 임. 3개일 경우 mul(A,B,C)는 A=B+C 임. B/C는 자동 변환되므로 get()을 사용할 필요 없음 */
  • inc(variable, byvalue, max, min), dec(variable, byvalue, max, min) /* 최초 min. 한번실행될 때마다 byvalue만큼 증가. max에 도달하면 다시 min으로 설정. byvalue 디폴트 1. */
  • Math.PI, Math.abs(var), acos, asin, atan, atan2, ceil, cos, exp, floor, log, max, min, pow, round, sin, sqrt, tan
  • roundval(variable, decimalplaces*) /* 반올림. */
  • txtadd(destination, txt1, txt2*, txt3*,...)  /* dest와 txt1 만 있을 경우에는 dest= dest+txt1, 여러개일 경우, dest=txt1+txt2+... 반드시 get()을 사용해야 함 */
  • subtxt(dstvar, srcvar, startpos, len) /* 일부를 추출 */
  • indexoftxt(dstvar, srctxt, searchtxt, startindex*)  /* startindex는 처음 찾기 시작하는 위치 */
  • tween(variable, destinationvalue, time*, tweentype*, donecall*, updatecall*) /* tween 액션은 시간을 제어하는 애니메이션에 사용됨. 변수의 현재값을 목표값으로 동적으로 변경시킴. 주어진 시간(디폴트 0.5)동안. tweentype 매개변수에는 내삽의 형태를 지정. tween 이 완료되고 변수의 값이 목표값에 도달하면 donecall이 수행됨. variable:변하는 변수, time: 목표값에 도달하는 시간. distance를 사용하면 짧은 거리에는 짧은시간, 긴거리에는 긴사간이 되도록 할 수 있음. tweentype: 내삽유형(디폴트 easeOutQuad), donecall:목표값에 도달한 뒤 수행되는 액션. "WAIT"로 지정하면 사용자의 간섭필요. updatecall:값이 변경될 때마다 수행되는 액션. */
  • stoptween(variable,...) tween action에 사용되는 변수(variable)을 중지시킴.
  • loadpano(xmlpath, vars*, flags*, blend*), loadxml(xmlstring, vars*, flags*, blend*), loadscene(scenename, vars*, flags*, blend*) /* 새로운 파노라마를 불러들임. keep="true"로 지정된 플러그인, 핫스팟, 이벤트, 렌즈플레어만 보존됨. loadpano 뒤에 추가적인 action 이 있으면, onstart 이벤트가 실행되지 않음. xmlpath:불러들일 파노라마의 경로. 지정하지 않으면 %FIRSTXML%이 기본으로 사용됨. xmlstring:수행될 xml. scenename:불러들일 <scene>의 이름. blend:NOBLEND/BLEND(n) n초에 걸쳐 블렌딩/ZOOMBLEND(n,z) n초동안 z배율로 */
  • reloadpano() /*"image.sphere.url"이나 "image.type" 같은 변수는 동적으로 변경시킬 수 없다. 이들 변수는 처음 로드할 때만 파싱된다. 따라서 변경된 이미지 변수는 다시불러와야 알 수 있다. */
  • openurl(url, target*) 이 기능을 오프라인에서 사용하려면  Flashplayer의 External Interface를 사용할 수 있어야 함. target:_blank,_self,_parent,_top */
  • lookat(atH, atV, fov*) 
  • lookto(toH, toV, fov*, motiontype*, shortestway*, nonblocking*, donecall*) looktohotspot(hotspotname, fov*, motiontype*, shortestway*) moveto(toH, toV, motiontyep*) zoomto(fov, motiontype*) /* 뷰를 현재위치에서 주어진 위치로 이동시킴. 시행되는 동안, 유저인터페이스및 다른 액션이 정지됨. 가능하게하려면 oninterrupt 액션을 사용해야 함. motiontype: linear(speed)/smooth(accel, break, maxspeed)/tween(tweentype, time), shortestway="true"이면 최단경로로 이동. 
  • adjusthlookat(desthlookat) ??
  • wait(parameter) /* parameter:숫자이면 초. LOAD, BLEND. 그동안 어떤함수도 유저인터랙션도 안됨. oninterrupt로 가능 */
  • freezeview(state) /* state="true"이면 현재 파노 view가 정지됨. 정지되면 렌더링성능이 좋아짐. 
  • oninterrupt(actions) /* user interface를 중지시키는 액션(lookto, looktohotspot, moveto, zoomto, wait/tween에서 donecall로 WAIT을 지정했을때) 시행 전에 설정. 이러한 액션중에 사용자가 마우스를 클릭하는 등을 시행하면 여기에 지정된 action이 수행됨. action에 "break"를 지정하면 중지되고 빠져나옴. */
  • screentosphere(x,y,h,v) spheretoscreen(h,v,x,y) /* x,y:스크린좌표(좌상단0,0), h,v:구면좌표(360/180도) 모든 매개변수로 변수를 사용해야 함. 상수를 쓰면 안됨) */
  • showtext(text,textstyle*) /*한번에 하나씩만. 새로 부르면 원래것은 사라짐. txt:표시될 문자열. html코드 사용가능. 단 <>는 []로 대체. 예:[b]bold text[/b], 다음줄은 [br]. txtstyle: xml text style */
  • updateoject(updateall*, updatefov*) /* 파노 객체의 내부 3D 모델을 재구축. display.details, display.tessmode 를 바꾼 뒤 반드시 실행시켜야 함. image.hfov, image.vfov, image.voffset을 대화식으로 변경시켰다면, updatefov="true"로 매개변수를 설정하여 실행시켜야 함. 
  • updatescreen() 파노라마 뷰를 강제로 다시 그림. 
  • invalidatescreen() 강제로 다시그림. 렌더링 품질이 movequality/movequality10으로 바뀜. 
  • addlayer(name), addplugin(name), addhotspot(name), addlensflare(name, ath*, atv*) 동적으로 생성
  • removelayer(name), removeplugin(name)...
  • js(jsfunction(parameters*)) /* global javascript 호출. 오프라인으로 실행할 경우 Flashplayer의 External Interface가 있어야 함. */
  • fscommand(...) /* standalone Flashplayer를 제어하기 위한 명령 */
  • showlog(state*) /* state="true"이면 로그가 표시됨 */
  • trace(...) /* 변수의 내용을 로그에 표시 */
  • error(errormessage)