65行目の数値を変更するとズームの位置を変更できる。
64行目を有効にするとズームが繰り返し表示される。
Mac用
zoom以外は位置がしっかり分かってから有効にすること。
local ffi = require("ffi")
--local XPLM = ffi.load("XPLM_64")--これがMacでのエラーの原因(これを入れたままだとX-Planeクラッシュ)
--////////////Macはエラーになるので以下を入れると問題なくなる-----------------------------
local ffi = require("ffi")
local XPLM = nil
local XPLMlib = "XPLM"
if SYSTEM_ARCHITECTURE == 64 then
if SYSTEM == "IBM" then
XPLMlib = "XPLM_64"
elseif SYSTEM == "LIN" then
XPLMlib = "Resources/plugins/XPLM_64.so"
else
XPLMlib = "Resources/plugins/XPLM.framework/XPLM"
end
else
if SYSTEM == "IBM" then
XPLMlib = "XPLM"
elseif SYSTEM == "LIN" then
XPLMlib = "Resources/plugins/XPLM.so"
else
XPLMlib = "Resources/plugins/XPLM.framework/XPLM"
end
end
XPLM = ffi.load(XPLMlib)
ffi.cdef("typedef void * XPLMDataRef;")
ffi.cdef("XPLMDataRef XPLMFindDataRef(const char * inDataRefName);")
ffi.cdef("int XPLMGetDatai(XPLMDataRef inDataRef);")
ffi.cdef("void XPLMSetDatai(XPLMDataRef inDataRef, int inValue);")
ffi.cdef("float XPLMGetDataf(XPLMDataRef inDataRef);")
ffi.cdef("void XPLMSetDataf(XPLMDataRef inDataRef, float inValue);")
ffi.cdef("double XPLMGetDatad(XPLMDataRef inDataRef);")
ffi.cdef("void XPLMSetDatad(XPLMDataRef inDataRef, double inValue);")
----------------------------------------------------------------------------------
-- All the C defs are from
-- http://www.xsquawkbox.net/xpsdk/mediawiki/Category:XPLMCamera
ffi.cdef([[typedef struct {
float x;
float y;
float z;
float pitch;
float heading;
float roll;
float zoom;
} XPLMCameraPosition_t;
typedef int (* XPLMCameraControl_f)(
XPLMCameraPosition_t * outCameraPosition, /* Can be NULL */
int inIsLosingControl,
void *inRefcon);
void XPLMControlCamera(
int inHowLong,
XPLMCameraControl_f inControlFunc,
void *inRefcon);
void XPLMReadCameraPosition(XPLMCameraPosition_t * outCamPos);
]])
function camControl(pos, isLosingControl, refcon)
logMsg("[cam control] zoom is " .. pos.zoom)
--pos.zoom = pos.zoom + .1
---if pos.zoom > 20 then
pos.x = 37894.04
pos.y = 173.47641
pos.z = 31487.572
pos.pitch = 0
pos.heading = 0
pos.roll = 0
pos.zoom = 1
--end
return 1
end
XPLM.XPLMControlCamera(1, camControl, nil)
https://forums.x-plane.org/index.php?/forums/topic/93013-reading-changing-zoom-using-flywithlua/
Macではそのまま実行するとエラーになる。
以下を追加してlocal XPLM = ffi.load(“XPLM_64”)を外すと実行できる。
これはzoomを実行していて、少しずつアップになりある程度まで行くともとに戻り、またズームが繰り返し実行される。
https://forums.x-plane.org/index.php?/forums/topic/123247-ffiloadxplm-on-mac/
Windows用
local ffi = require("ffi")
local XPLM = ffi.load("XPLM_64")
-- All the C defs are from
-- http://www.xsquawkbox.net/xpsdk/mediawiki/Category:XPLMCamera
ffi.cdef([[typedef struct {
float x;
float y;
float z;
float pitch;
float heading;
float roll;
float zoom;
} XPLMCameraPosition_t;
typedef int (* XPLMCameraControl_f)(
XPLMCameraPosition_t * outCameraPosition, /* Can be NULL */
int inIsLosingControl,
void *inRefcon);
void XPLMControlCamera(
int inHowLong,
XPLMCameraControl_f inControlFunc,
void *inRefcon);
void XPLMReadCameraPosition(XPLMCameraPosition_t * outCamPos);
]])
function camControl(pos, isLosingControl, refcon)
logMsg("[cam control] zoom is " .. pos.zoom)
--pos.zoom = pos.zoom + .1
--if pos.zoom > 20 then
pos.x = 37894.04
pos.y = 173.47641
pos.z = 31487.572
pos.pitch = 0
pos.heading = 0
pos.roll = 0
pos.zoom = 1
--end
return 1
end
XPLM.XPLMControlCamera(1, camControl, nil)
参考dataref
–sim/graphics/view/cockpit_roll
–sim/graphics/view/cockpit_heading
–sim/graphics/view/cockpit_pitch
sim/graphics/view/view_heading
sim/graphics/view/view_pitch
sim/graphics/view/view_roll
sim/graphics/view/view_x
sim/graphics/view/view_y
sim/graphics/view/view_z