Skip to content
dfdyz edited this page Dec 20, 2024 · 18 revisions

新版API直接看 源码

特殊说明

LuaPhysShip就是物理帧事件数据对象,getControllerRotationMat() 以及 欧拉角 会自动转换到控制器坐标系(箭头方向为front向量) 全息显示器基本无变动

虚空动力 ComputerCraft 外设API手册 & 食用指南 V1.2.1(旧版)

EngineController(引擎中控器)

作用:通过ComputerCraft中的电脑来驱动飞船。

当方块被加载的时候,会自动设置为待机模式。

待机模式下,会提供高额的旋转阻尼和运动阻尼以保持船体静止。通过连接CC可开关待机模式。

当控制器所在的船上驱动质量总和小于船体质量时(引擎太少、转速不够或应力过载),控制器将无法驱动飞船(会瞬间阳痿,请保证引擎有持续且稳定的应力供应)。

CC外设API

方法(参数): 返回值类型

getId(): long

返回:船的数字ID

getName(): string

返回:船的名字

getMass(): double

返回:船的质量

setIdle(boolean): void

开关待机模式。待机模式开启时,将产生巨大的运动阻尼并施加一个与重力相反的力(可能会和别的mod的力有冲突导致往上飘)。

getMomentOfInertiaTensor(): table -> Matrix3x3

返回:船体当前的惯性张量(3x3矩阵)。

getOmega(): table -> vector3

返回:船当前的角速度

getRotation(): table -> quaternion

返回:船当前的旋转姿态

getPosition(): table -> quaternion

返回:船当前的世界坐标

getVelocity(): table -> quaternion

返回:船当前的速度

getFaceVector(): table -> vector3

返回:控制器箭头朝向(世界坐标系)

getFaceRaw(): table -> vector3

返回:控制器方块朝向(船坐标系)

getRoll(): double

getYaw(): double

getPitch(): double

返回:滚转,偏航,俯仰

isOnShip(): boolean

返回:控制器是否在船上

getRotationMatrix(): table -> Matrix4x4

返回:船体当前姿态的旋转矩阵。

getMassCanDrive(): double

返回:当前该船上的引擎可驱动的总质量

applyInvariantForce(double x, double y, double z): void

作用:施加一个恒力(时长为1物理帧)

applyInvariantTorque(double x, double y, double z): void

作用:施加一个恒定扭矩(时长为1物理帧)

applyInvariantForceToPos(double px, double py, double pz, double fx, double fy, double fz): void

作用:在指定坐标处施加一个恒力(时长为1物理帧)

applyRotDependentForce(double x, double y, double z): void

作用:以船自身为参照系,对船施加一个恒力(时长为1物理帧)

applyRotDependentTorque(double x, double y, double z): void

作用:以船自身为参照系,对船施加一个恒定扭矩(时长为1物理帧)

applyRotDependentForceToPos(double px, double py, double pz, double fx, double fy, double fz): void

作用:以船自身为参照系,对船指定坐标处施加一个恒力(时长为1物理帧)

CC系统事件(os.pullEvent)

phys_tick: table -> physShipSnapshot

触发时机:每物理帧触发一次

事件返回值:船当前帧的运动信息(线速度,角速度,姿态等)

API相关数据类型

vector3: table

成员:x,y,z

quaternion: table

成员:x,y,z,w

Matrix3x3: table[3][3]

二维数组

Matrix4x4: table[4][4]

二维数组

physShipSnapshot: object: table

成员:

​ getInertia(): table -> inertiaInfo

​ 返回:惯性信息(惯性张量矩阵和质量)。

​ getPoseVel(): table -> poseInfo

​ 返回:姿态信息。

​ getBuoyantFactor(): double

​ 返回:浮力系数

inertiaInfo: table

成员字段:

​ momentOfInertiaTensor: Matrix3x3

​ 当前惯性张量矩阵

​ mass: double

​ 当前质量

poseInfo

成员字段:

​ velocity: vector3 速度

​ omega: vector3 角速度

​ pos: vector3 坐标

​ rot: quaternion 旋转

​ yaw,pitch,row: double 偏航,俯仰,滚转

ControllerFacesVectors

成员字段:

​ up, right, front: vector3 控制器在世界空间的三轴指向(以模型贴图上的箭头方向为front)

Tips

请使用phys_tick来获取船的运动信息,并随事件同步执行 applyForce 等操作。

VoidEngine (虚空引擎)

根据转速消耗应力,提供驱动质量上限(可叠加,类似尤里卡的炉子)

驱动质量计算公式: 转速 x EngineStressPerRPM x EngineMassPerStress

EngineStressPerRPM 和 EngineMassPerStress 可在配置文件中更改,默认分别为 8 和 10000

GlassScreen(玻璃屏幕)

和原版的monitor一样。但是多了setTransparentMode(boolean)和setTransparentColor(colour)

colour是cc的api里面那个

Hologram(全息显示器)

CC外设API(类型:hologram)

!!!!所有涉及像素点存储的数组,索引都是从 [0] 开始!!!!

颜色格式:int_32 0xRRGGBBAA

Resize(int w, int h): void

设置屏幕的分辨率。

SetClearColor(int color): void

设置清屏颜色。

Flush(): void

刷新屏幕(将屏幕重新渲染)。

Blit(int x, int y, int w, int h, map<int, int> pixels [, int mode = 0]): void

将传入的像素点阵(Lua table)绘制到当前缓冲区。

其中 mode = 0 为覆盖模式,会将当前缓冲区内的颜色强行覆盖;

mode = 1 为裁剪模式,当buffer内的颜色Alpha>0时,会将当前缓冲区内的颜色强行覆盖;

mode = 2 为混合模式,会将当前缓冲区内的颜色和buffer内的颜色混合。

Text(int x, int y, String text , int color, int mode): void

绘制文字到当前缓冲区。

mode同上,但 覆盖模式和裁剪模式 的效果相同。

文本支持Unicode中文(仅支持GBK支持的字符集)。

Fill(int x, int y, int w, int h , int color [, int mode = 0]): void

填充当前缓冲区指定区域。

mode同上,但 覆盖模式和裁剪模式 的效果相同。

DrawLine(int x0, int y0, int x1, int y1, int color, int mode): void

绘制直线。

DrawTriangle(int x0, int y0, int x1, int y1,int x2, int y2, int color0, int color1, int color2[, int mode]): void

绘制三角形到当前缓冲区。

DrawTriangleWithTexture(table v1, table v2, table v3, int framebufferId, int mode): void

绘制带纹理的三角形,纹理从framebuffer中采样。 顶点数组vertexs的格式为:

{x, y, u, v}

Clear(): void

使用设定的颜色重置屏幕缓冲区。

SetTranslation(double x, double y, double z): void

设置画面的位置偏移。

SetRotation(double yaw, double pitch, double roll): void

设置画面的旋转。

SetScale(double x, double y): void

设置画面的缩放。

GetBlockPos(): int x, int y, int z

获取屏幕方块坐标。

GetName(): String

获取当前屏幕的名字。

Rename(String new): void

重命名屏幕。

CreateFrameBuffer(int width, int height): int

创建一个帧缓冲。 返回:帧缓冲编号

GetMaxFrameBufferCount(): int

获取当前屏幕最大帧缓冲数量。

GetFrameBufferCount(): int

获取已分配的帧缓冲数量。

FreeAllFrameBuffer(): int

释放所有帧缓冲。

FreeFrameBuffer(int id): int

释放指定帧缓冲。

SetCurrentFrameBuffer(int id): int

设置想要操作的帧缓冲。(当id小于0时为屏幕的颜色缓冲区)

DumpFrameBuffer(): table

导出当前帧缓冲像素数组。 返回:帧缓冲数据。格式:{w = ?, h = ?, pixels = { 0x00000000, 0x00000000......}} pixels的索引从0开始。

BlitFrameBuffer(int x, int y, int id[, int mode): void

将指定帧缓冲输出到当前操作的帧缓冲的指定位置上。

SetPixel(int x, int y, int color): void

在当前缓冲区的指定位置设置像素颜色。

GetPixel(int x, int y): int color

获取当前缓冲区指定位置颜色。

CC系统事件

vp_key_pressed: screen_name -> String, keycode -> int

在gui中按下按键。

vp_key_released: screen_name -> String, keycode -> int

在gui中松开按键。

vp_mouse_clicked: screen_name -> String, button -> int, x -> int, y -> int

在gui按下鼠标。

vp_mouse_released: screen_name -> String, button -> int, x -> int, y -> int

在gui松开鼠标。

vp_mouse_scrolled: screen_name -> String, delta -> double, x -> int, y -> int

在gui滚动滚轮。

参考代码1

s = peripheral.wrap("right")

local function BakeBitMap(buf, color)
    local b = {}
    i = 0
    for _, v in ipairs(buf) do
        if v > 0 then
            b[i] = color
        else
            b[i] = 0x00000000
        end
        i = i + 1
    end
    return b
end

buffer = {}
for i = 0, (512*256-1) do
    buffer[i] = 0x00A0FF6F
end

img = {
    0,1,1,0,
    1,0,0,1,
    1,1,1,1,
    1,0,0,1,
    1,0,0,1,
    0,0,0,0,
}

img = BakeBitMap(img, 0xFF00FFF0)
img2 = BakeBitMap(img, 0xFF00FFFF)

s.Resize(512,256)
s.SetRotation(-15, 15, 0)
s.SetTranslation(0,1,0)
s.SetScale(0.125, 0.125)

s.Fill(256, 128, 256, 128,0xFFA00080,0);
s.Blit(2,10,4,6,img,0)
s.Blit(8,10,4,6,img,1)
s.Blit(14,10,4,6,img,2)
str = "\\u865A\\u7A7A\\u52A8\\u529B\n --Hologram."
s.Text(-3, 50, str, 0xFFFFFF8F, 0)
s.Text(5, 80, str, 0xFFFFFF8F, 2)

s.Flush()

参考代码2

s = peripheral.wrap("right")

s.SetRotation(-30, 5, 0)
s.SetTranslation(0.3,1.0, 0)
s.SetScale(0.15, 0.15)

s.FreeAllFrameBuffer()

fb = s.CreateFrameBuffer(128,128)
s.SetCurrentFrameBuffer(fb)
print(fb)
s.Clear()
s.DrawTriangle(4,8,100,4,50,80,0xFF000080,0x0000FF80,0x00FF0080,0)

s.SetCurrentFrameBuffer(-1)
s.Resize(256,160)
s.Clear()
s.BlitFrameBuffer(16,3,fb)

s.Flush()
s.SetCurrentFrameBuffer(fb)
return s.DumpFrameBuffer()

参考代码3

https://github.com/dfdyz/VoidPowerMod/blob/main/%E5%85%A8%E6%81%AF%E5%B1%8Fhud%E7%A4%BA%E4%BE%8B.zip

Clone this wiki locally