[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31663] branches/soc-2010-aligorith-2/ release/scripts/op/add_rigidbody_wall.py: Bullet SoC - Improved "Wall" template
Joshua Leung
aligorith at gmail.com
Mon Aug 30 15:07:28 CEST 2010
Revision: 31663
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31663
Author: aligorith
Date: 2010-08-30 15:07:28 +0200 (Mon, 30 Aug 2010)
Log Message:
-----------
Bullet SoC - Improved "Wall" template
Changes:
* Made dimensions of the bricks more realistic. They were previously 3m x 1m x 1m monsters weighing only 1 kg
* Alternating rows are "offset" by half-a-brick, and shorter by 1-brick to compensate. On by default.
* Alternating rows can have 'half-bricks' to fill in the spaces left by the offsets. Off by default, and only useful when the previous option is enabled.
* Initial/source brick is no longer kept, removing the problem where one column of bricks were always seen to explode (due to overlapping bricks).
* Code reshuffle...
See http://aligorith.blogspot.com/2010/08/bullet-soc-experiments-fixes-and-more.html for visual illustrations of most of these.
Modified Paths:
--------------
branches/soc-2010-aligorith-2/release/scripts/op/add_rigidbody_wall.py
Modified: branches/soc-2010-aligorith-2/release/scripts/op/add_rigidbody_wall.py
===================================================================
--- branches/soc-2010-aligorith-2/release/scripts/op/add_rigidbody_wall.py 2010-08-30 12:27:34 UTC (rev 31662)
+++ branches/soc-2010-aligorith-2/release/scripts/op/add_rigidbody_wall.py 2010-08-30 13:07:28 UTC (rev 31663)
@@ -18,6 +18,8 @@
import bpy
+##############################
+
# add 'brick' mesh
def add_brick(context, major_radius, minor_radius, mass):
# add new brick as a cube
@@ -42,6 +44,101 @@
return brick;
+# ----------------
+
+# add most of the objects representing the wall - fullsized bricks
+# < wall: (Object) dummy object acting as 'owner' of entire wall
+def addWallBricks(context, props, wall):
+ # add single brick
+ # - this will end up being the source brick from which
+ # all other 'normal' bricks are derived
+ # - assume that this is added at (0,0,0)
+ # - set parent to 'wall' object so that all can be moved at once
+ brick = add_brick(context, props.major_length, props.minor_length, props.mass)
+ brick.parent = wall
+
+ # construct the wall by duplicating the brick as many times as needed
+ for row in range(props.rows):
+ # number of bricks per row varies if we're using offsetted rows
+ # on that row, as the offsets are have half-brick lengths which constitute to one less "whole"
+ # brick less needed for that row
+ if props.use_row_offsets and (row % 2) != 0:
+ rowCols = props.columns - 1
+ else:
+ rowCols = props.columns
+
+ # create bricks for this row
+ for col in range(rowCols):
+ # make a copy of the active brick
+ bpy.ops.object.duplicate(linked=True)
+ curBrick = context.active_object
+
+ # calculate the positions based on the row and column
+ # 1) "+ minor_length" factor makes sure wall will be nicely
+ # off a standard ground plane (at z=0)
+ rowLoc = (2 * props.minor_length) * row + props.minor_length
+ # 2) offset depends on whether this is on a row with half-bricks
+ if rowCols == props.columns:
+ # normal case - no offset
+ colLoc = (2 * props.major_length) * col
+ else:
+ # half-brick row - offset by half width
+ colLoc = (2 * props.major_length) * col + props.major_length
+
+ curBrick.location = (colLoc, 0.0, rowLoc)
+
+ # get rid of starting brick
+ bpy.ops.object.select_all(action='DESELECT')
+ brick.selected = True
+ bpy.ops.object.delete()
+
+# add the half bricks on alternating rows
+# < wall: (Object) dummy object acting as 'owner' of entire wall
+def addWallHalfBricks(context, props, wall):
+ # half-brick major length
+ hlen = props.major_length / 2.0
+
+ # add single brick
+ # - this will end up being the source brick from which
+ # all other 'half' bricks are derived
+ # - halve the length and mass, but leave the other dimensions alone
+ # - assume that this is added at (0,0,0)
+ # - set parent to 'wall' object so that all can be moved at once
+ brick = add_brick(context, hlen, props.minor_length, props.mass/2.0)
+ brick.parent = wall
+
+ # calculate horizontal positions
+ # 1) slightly offset to account for shorter length
+ xL1 = -hlen
+ # 2) last normal brick position, plus an extra half-brick length
+ xL2 = (2*props.major_length)*(props.columns-1) + hlen
+ # as a tuple for simpler code (but slightly more mem)
+ xLocs = (xL1, xL2)
+
+ # construct the wall by duplicating the brick as many times as needed
+ # - only do every second row, adding two bricks; one to each end
+ for row in range(1, props.rows+1, 2):
+ # calculate vertical positon:
+ # + minor_length" factor makes sure wall will be nicely
+ # off a standard ground plane (at z=0)
+ rowLoc = (2 * props.minor_length) * row + props.minor_length
+
+ # create the two bricks needed
+ for xLoc in xLocs:
+ # make a copy of the active brick
+ bpy.ops.object.duplicate(linked=True)
+ curBrick = context.active_object
+
+ # move into position
+ curBrick.location = (xLoc, 0.0, rowLoc)
+
+ # get rid of starting brick
+ bpy.ops.object.select_all(action='DESELECT')
+ brick.selected = True
+ bpy.ops.object.delete()
+
+##############################
+
from bpy.props import *
class AddRbWall(bpy.types.Operator):
@@ -56,13 +153,20 @@
columns = IntProperty(name="Columns",
description="Number of bricks per row",
default=5, min=1, max=256)
+
+ use_row_offsets = BoolProperty(name="Use Row Offsets",
+ description="Every second row is offsetted by a half-brick and shortened to create an alternating pattern",
+ default=True)
+ use_half_bricks = BoolProperty(name="Use Half Bricks",
+ description="When 'Use Row Offsets' is enabled, add half-sized bricks in the offset spaces",
+ default=False)
major_length = FloatProperty(name="Major Length",
description="Distance from center to edge along widest axis",
- default=1.5, min=0.01, max=100.0)
+ default=0.15, min=0.01, max=100.0)
minor_length = FloatProperty(name="Minor Length",
description="Distance from center to edge along all other axes",
- default=0.5, min=0.01, max=100.0)
+ default=0.05, min=0.01, max=100.0)
mass = FloatProperty(name="Mass",
description="How much each brick weighs (same as for Rigid Bodies)",
@@ -74,35 +178,24 @@
def execute(self, context):
props = self.properties
- # add single brick
- # - this will end up being the source brick from which
- # all other bricks are derived
- # - it will also be the lower-left brick in the wall...
- # - assume that this is added at (0,0,0)
- brick = add_brick(context, props.major_length, props.minor_length, props.mass)
+ # add empty to add as dummy wall control
+ bpy.ops.object.add(type='EMPTY')
- # duplicate this brick as many times as needed
- for row in range(props.rows):
- for col in range(props.columns):
- # make a copy of the active brick
- bpy.ops.object.duplicate()
- curBrick = context.active_object
-
- # set parent to original brick so they can all be moved at once
- curBrick.parent = brick
-
- # calculate the positions based on the row and column
- rowLoc = (2 * props.minor_length) * row
- colLoc = (2 * props.major_length) * col
-
- curBrick.location = (colLoc, 0.0, rowLoc)
-
- # select only the starting brick
+ wall = context.active_object
+ wall.name = "RbWallOb"
+
+ # add half-bricks
+ if props.use_row_offsets and props.use_half_bricks:
+ addWallHalfBricks(context, props, wall)
+
+ # add bricks of the wall
+ addWallBricks(context, props, wall)
+
+ # set wall owner as only selected object
bpy.ops.object.select_all(action='DESELECT')
+ wall.selected = True
+ context.scene.objects.active = wall
- brick.selected = True
- context.scene.objects.active = brick
-
return {'FINISHED'}
More information about the Bf-blender-cvs
mailing list