PhysicsQueryContactMaterialSlot ( query,index,point,side )
Parameters
|
query - live physics-query handle containing the required result kind index - 1-based result or manifold index point - 1-based contact point side - 1 = native A; 2 = native B |
Description
|
Returns the material slot at one side of a contact point. Returns the 1-based material slot copied at a current-contact query point for side A (1) or B (2). index is the 1-based manifold and point is the 1-based contact point. An unresolved triangle/side raises a runtime error. Handles must be live and of the correct kind. Material slots are 1-based; slot 1 is the base material and the first table entry, not an independent fallback. Mesh and terrain tables belong to each shape. Material edits retain density, body mass, filtering, event flags, shape tags and the public shape handle. Friction, restitution and rolling resistance must be finite and non-negative. Values above one are permitted. Friction products and the squared tangent-velocity length must be representable. Invalid ranges or allocations fail before replacing the material/geometry. Readbacks do not wake bodies. Edits invalidate cached contact material sampling and wake affected enabled bodies; disabled bodies stay disabled. Replacing the native shape for table resizing/painting invalidates its current contacts. Ray and contact-query material numbers are copied snapshots; later painting, table edits or shape destruction do not alter them. A current-contact query samples each point's assigned material when queried, which can differ from cached coefficients of the last solve after an edit. Native mesh/terrain contact response can average several touched triangle materials. Material IDs in hit events are copied at the hit. Material table entries, painting, refresh and resulting wake operations record/replay through Blitz3D+. Table edits use an added native recording opcode, so such recordings require the patched Blitz3D+ player; older opcodes are unchanged. Terrain preferences under holes are wrapper metadata; later recorded refresh captures the resulting collision geometry. Physics replay does not restore render meshes or this editable authoring metadata. Requires Extended mode. See also: PhysicsShapeMaterial, PhysicsShapeMaterials, PhysicsShapeTangentVelocity, PhysicsMeshTriangleMaterial, PhysicsTerrainCellMaterial, PhysicsQueryMaterialSlot. |
Example
; PhysicsQueryContactMaterialSlot Example ; --------------------------------------- ; Requires Extended mode. Graphics3D 640,480,0,2 SetBuffer BackBuffer() Const PHYSICS_STATIC=0 Const PHYSICS_DYNAMIC=2 camera=CreateCamera() PositionEntity camera,0,3,-7 RotateEntity camera,20,0,0 light=CreateLight() RotateEntity light,45,-30,0 AmbientLight 60,60,60 ; An independent Box3D world with standard gravity world=CreatePhysicsWorld() ; Blue static floor ground=CreateCube() ScaleEntity ground,6,0.5,6 PositionEntity ground,0,-0.5,0 EntityColor ground,80,160,255 ground_body=CreatePhysicsBody(world,ground,PHYSICS_STATIC) ground_shape=PhysicsBodyBox(ground_body,12,1,12) ; A static mesh ramp made of 8 strips, each strip two triangles ramp=CreateMesh() surface=CreateSurface(ramp) For strip=0 To 7 x#=strip-4 AddVertex surface,x,1.6-strip*0.2,-1.5 AddVertex surface,x,1.6-strip*0.2,1.5 AddVertex surface,x+1,1.4-strip*0.2,-1.5 AddVertex surface,x+1,1.4-strip*0.2,1.5 AddTriangle surface,strip*4,strip*4+1,strip*4+3 AddTriangle surface,strip*4,strip*4+3,strip*4+2 Next UpdateNormals ramp EntityFX ramp,2 ramp_body=CreatePhysicsBody(world,ramp,PHYSICS_STATIC) ramp_shape=PhysicsBodyMesh(ramp_body,ramp) ; Slot 2 of the ramp's material table is ice, with no friction PhysicsShapeMaterials ramp_shape,2 PhysicsShapeMaterialFriction ramp_shape,2,0 query=CreatePhysicsQuery(world) ; Crates resting on the grippy ramp Dim crate_bodies(3) For i=0 To 3 crate=CreateCube() ScaleEntity crate,0.3,0.3,0.3 EntityColor crate,255,120,70 crate_bodies(i)=CreatePhysicsBody(world,crate,PHYSICS_DYNAMIC) crate_shape=PhysicsBodyBox(crate_bodies(i),0.6,0.6,0.6) ResetPhysicsBody crate_bodies(i),-3.5+i*2,2-i*0.4,0,0,0,-0.2 Next PaintStrips(ramp,painted) While Not KeyDown(1) ; Space paints the next strip as ice, so the crates slide If KeyHit(57) And painted<8 PhysicsMeshTriangleMaterial ramp_shape,painted*2,2,2 painted=painted+1 PaintStrips(ramp,painted) EndIf StepPhysics world,1.0/60.0,4 ; Copy the first crate's contact with the ramp, and find which side is the ramp manifolds=QueryPhysicsBodyContacts(query,crate_bodies(0)) side=1 If manifolds>0 If PhysicsQueryContactBody(query,1,2)=ramp_body Then side=2 EndIf ; Arrow keys move the camera If KeyDown(200) Then MoveEntity camera,0,0,0.1 If KeyDown(208) Then MoveEntity camera,0,0,-0.1 If KeyDown(203) Then TurnEntity camera,0,1,0 If KeyDown(205) Then TurnEntity camera,0,-1,0 RenderWorld Text 0,0,"Arrow keys: move camera Space: paint ice Esc: exit" If manifolds>0 Then Text 0,20,"PhysicsQueryContactMaterialSlot(query,1,1,side) = "+PhysicsQueryContactMaterialSlot(query,1,1,side) Text 0,20,"(1 grip, 2 ice: paint the first strip to change it)" Flip Wend FreePhysicsWorld world End Function PaintStrips(ramp,painted) ; Ice strips are pale blue, grippy strips are green surface=GetSurface(ramp,1) For v=0 To CountVertices(surface)-1 If v/4<painted VertexColor surface,v,200,230,255 Else VertexColor surface,v,120,200,140 EndIf Next End Function
Index