pymunk.batch 模块

批处理模块包含有效获取和设置空间数据的功能

一批而不是一个接一个。

备注

该模块是高度实验性的,可能会在未来的Pymunk版本中发生变化,包括主要版本、次要版本和补丁版本!

要获取数据

首先创建空间和两个实体。

>>> import pymunk, pymunk.batch
>>> s = pymunk.Space()
>>> b1 = pymunk.Body(1, 1)
>>> b1.position = 1,2
>>> s.add(b1, pymunk.Circle(b1, 4))
>>> b2 = pymunk.Body(1,1)
>>> b2.position = 3,4
>>> s.add(b2, pymunk.Circle(b2, 4))

要获取数据,首先创建一个缓冲区持有者对象,该对象用于在调用之间重复使用底层数组。然后调用批处理方法。请注意,需要显式指定正文上要提取的字段。

>>> data = pymunk.batch.Buffer()
>>> pymunk.batch.get_space_bodies(
...     s,
...     pymunk.batch.BodyFields.BODY_ID | pymunk.batch.BodyFields.POSITION,
...     data,
... )

数据在Buffer对象中作为cffi缓冲区可用。一个包含任何int数据,另一个包含浮点数据。您可以像这里一样直接使用它,但也可以将其传递给像numpy数组一样实现缓冲协议的第三方。

>>> list(memoryview(data.int_buf()).cast("P")) == [b1.id, b2.id]
True
>>> list(memoryview(data.float_buf()).cast("d"))
[1.0, 2.0, 3.0, 4.0]

还可以获得碰撞数据的仲裁者。请注意,我们需要调用步骤来运行模拟,并首先清除数据数据缓冲区,以便可以重复使用它们:

>>> s.step(1)
>>> data.clear()
>>> pymunk.batch.get_space_arbiters(
...     s,
...     pymunk.batch.ArbiterFields.BODY_A_ID | pymunk.batch.ArbiterFields.BODY_B_ID,
...     data,
... )
>>> list(memoryview(data.int_buf()).cast("P")) == [b2.id, b1.id]
True
>>> list(memoryview(data.float_buf()).cast("d"))
[]

设置数据

(see planet.py示例)

TODO

class pymunk.batch.ArbiterFields(new_class_name, /, names, *, module=None, qualname=None, type=None, start=1, boundary=None)[源代码]

基类:Flag

用于指定要获取的仲裁器属性的标志字段。

ALL = 65535

所有的田野

BODY_A_ID

pymunk.Body.id 正文A的值存储在int_buf中。

BODY_B_ID

pymunk.Body.id 正文B的值存储在int_buf中。

CONTACT_COUNT

联系人数量(1或2)`。存储在int_buf中的值。

DISTANCE_1

pymunk.ContactPoint.distance 联系人的1。值存储在FLOAT_BUF中。

DISTANCE_2

pymunk.ContactPoint.distance 联系人的2。值存储在FLOAT_BUF中。

IS_FIRST_CONTACT

pymunk.Arbiter.is_first_contact 。存储在int_buf中的值(0或1)。

NORMAL

pymunk.Arbiter.normal 。X和Y存储在FLOAT_BUF中。

POINT_A_1

pymunk.ContactPoint.point_a 存储在FLOAT_BUF中的联系人1的X和Y。

POINT_A_2

pymunk.ContactPoint.point_a 存储在FLOAT_BUF中的联系人2的X和Y。

POINT_B_1

pymunk.ContactPoint.point_b 存储在FLOAT_BUF中的联系人1的X和Y。

POINT_B_2

pymunk.ContactPoint.point_b 存储在FLOAT_BUF中的联系人2的X和Y。

TOTAL_IMPULSE

pymunk.Arbiter.total_impulse 。X和Y存储在FLOAT_BUF中。

TOTAL_KE

pymunk.Arbiter.total_ke 。存储在FLOAT_BUF中的值。

class pymunk.batch.BodyFields(new_class_name, /, names, *, module=None, qualname=None, type=None, start=1, boundary=None)[源代码]

基类:Flag

用于指定要获取的正文属性的标志字段。

ALL = 65535

所有的田野

ANGLE

pymunk.Body.angle 。存储在FLOAT_BUF中的值。

ANGULAR_VELOCITY

pymunk.Body.angular_velocity .存储在float_buf中的值

BODY_ID

pymunk.Body.id 。存储在int_buf中的值。

FORCE

pymunk.Body.force . X和Y存储在float_buf中。

POSITION

pymunk.Body.position 。X和Y存储在FLOAT_BUF中。

TORQUE

pymunk.Body.torque .存储在float_buf中的值

VELOCITY

pymunk.Body.velocity 。X和Y存储在FLOAT_BUF中。

class pymunk.batch.Buffer[源代码]

基类:object

clear() None[源代码]

将内部数组标记为空(以供重复使用)。

通过调用Clear重用BatchedData对象及其内部数组比每一步创建一个新对象更有效。

float_buf() pymunk._chipmunk.ffi.buffer[源代码]

返回内部数组中浮点数据的CFFI缓冲区对象。

int_buf() pymunk._chipmunk.ffi.buffer[源代码]

返回内部数组中整数数据的CFFI缓冲区对象。

set_float_buf(buffer: Any) None[源代码]

将浮点内部数据设置到提供的缓冲区。

buffer应该是一个浮点数数组,像numpy数组或array. array一样体现buffer/memoryview接口。

(From Python 3.12缓冲区参数将被类型为collections。abc.Buffer)

set_int_buf(buffer: Any) None[源代码]

将整数内部数据设置为提供的缓冲区。

buffer应该是一个int数组,像numpy数组或array. array一样体现buffer/memoryview接口。

(From Python 3.12缓冲区参数将被类型为collections。abc.Buffer)

pymunk.batch.get_space_arbiters(space: Space, fields: ArbiterFields, buffers: Buffer) None[源代码]

获取空间中所有活动仲裁器的数据。

使用FIELS属性筛选出您感兴趣的字段。

数据在BATCHED_DATA缓冲区中返回。

pymunk.batch.get_space_bodies(space: Space, fields: BodyFields, buffers: Buffer) None[源代码]

获取空间中所有身体的数据。

使用FIELS属性筛选出您感兴趣的字段。

数据在BATCHED_DATA缓冲区中返回。