Primary NavigationPrimary Navigation
Slide 1
The role of chance in cognition

Is reality ultimately based on pure randomness or is there an organizing causal principle? This question pertains to the problem of probability in quantum mechanics and quantum cognition. Is all matter ultimately due to a random fluctuation or is there a causal principle. The same question can be applied to the domain of thought. Are thoughts caused or are they random events?
Is randomness stressed so much to occult causes? Is that a reason why causality is challenged as a a general organising principle?

Classical probability: Maxwell-Boltzman statistics ("normal dice")

Quantum probability: Bose–Einstein statistics ("quantum dice")

When casting a pair of "normal dice", there are thirty-six possible outcomes, one of which yields a total of 12, two of which yield a total of 11, three of which yield a total of 10, and so on. The corresponding probabilities are therefore 1/36, 2/36 = 1/18, and 3/36 = 12, respectively (see Table 1 below).

When casting an (imaginary) pair of "quantum dice", there are 6 + 30/2 = 21 possible outcomes. The probability of casting a first 6 is 1/6. Since the probability of casting a second 6 is twice the probability of subsequently casting a different number, and since the probabilities of the six possible outcomes of the second cast add up to 1, the probability of a second 6 is 2/7. The probability of casting a total of 12 is thus (1/6) x (2/7) = 1/21 (see Table 2 below). In all there are six ways of casting equal numbers, each with a probability of 1/21, and there are fifteen ways of casting different numbers, each with a probability of (1 - 6 x 1/21)/15 = 1/21. (Fifteen rather than thirty because, in the case of indistinguishable dice, the order in which they are cast does not enter the picture.)

When casting two "normal" dice, the individual outcomes are uncorrelated. The probabilities assigned to the possible outcomes of one cast are independent of the outcome of another cast. When casting two "quantum dice", on the other hand, the individual outcomes are correlated. For "quantum dice", the probability of obtaining a 6 increases with the number of dice already showing a 6.

Maxwell-Boltzman statistics

6,1

5,1
5,2
6,2

4,1
4,2
4,3
5,3
6,3

3,1
3,2
3,3
3,4
4,4
5,4
6,4

2,1
2,2
2,3
2,4
2,5
3,5
3,5
5,5
6,5

1,1
1,2
1,3
1,4
1,5
1,6
2,6
3,6
4,6
5,6
6,6

2
3
4
5
6
7
8
9
10
11
12

1/36
2/36
3/36
4/36
5/36
6/36
5/36
4/36
3/36
2/36
1/36

Table 1. Probability distribution for “classical dice.”

Bose–Einstein statistics

3,3
3,4
4,4

2,2
2,3
2,4
2,5
3,5
3,5
5,5

1,1
1,2
1,3
1,4
1,5
1,6
2,6
3,6
4,6
5,6
6,6

2
3
4
5
6
7
8
9
10
11
12

1/21
2/21
2/21
2/21
3/21
3/21
3/21
2/21
2/21
1/21
1/21

Table 2. Probability distribution for “quantum dice.”

Slide 1
var loader:URLLoader = new URLLoader(new URLRequest("https://christopher-germann.de/wp-content/uploads/quantum-dice.txt"));
loader.addEventListener(Event.COMPLETE, completeHandler);

function completeHandler(event:Event):void {
    var loadedText:URLLoader = URLLoader(event.target);
  myText_txt.htmlText = loadedText.data;
}

import away3d.cameras.*;
import away3d.containers.*;
import away3d.materials.*;
import away3d.primitives.*
import away3d.lights.DirectionalLight3D

import jiglib.physics.RigidBody;
import jiglib.plugin.away3d.Away3DPhysics;
import jiglib.plugin.away3d.Away3dMesh;
import jiglib.math.JNumber3D


var scene:Scene3D;
var camera:HoverCamera3D;
var view:View3D;
var light:DirectionalLight3D;
var physics:Away3DPhysics;


var boxWidth:Number = 250
var boxHeight:Number = 30
var boxDepth:Number = 250
var boxThickness:Number = 5

var diceTextures:Array = [ new WhiteShadingBitmapMaterial( new diceTexture1(0,0) ),
               new WhiteShadingBitmapMaterial( new diceTexture2(0,0) ),
               new WhiteShadingBitmapMaterial( new diceTexture3(0,0) ),
               new WhiteShadingBitmapMaterial( new diceTexture4(0,0) ),
               new WhiteShadingBitmapMaterial( new diceTexture5(0,0) ),
               new WhiteShadingBitmapMaterial( new diceTexture6(0,0) ) ]
               
                        

var wallTexture:WhiteShadingBitmapMaterial = new WhiteShadingBitmapMaterial( new walltexture(0,0))
var groundTexture:WhiteShadingBitmapMaterial = new WhiteShadingBitmapMaterial( new groundtexture(0,0))

var diceScale:Number = 30
var dices:Array = new Array()
var diceRandomForce:Number = 50

function initAway3D():void {
  scene = new Scene3D();

  camera = new HoverCamera3D();
  camera.distance = 500

  light = new DirectionalLight3D({color:0xFFFFFF, ambient:0.25, diffuse:0.75, specular:0.9})
  scene.addChild(light)
  
  view=new View3D({scene:scene,camera:camera});
  view.x=stage.stageWidth/2;
  view.y=stage.stageHeight/2;
  addChild(view);
  
  physics = new Away3DPhysics(view,4)
  
}

function createWalls():void {
  var left:RigidBody = physics.createCube({width:boxThickness, height:boxHeight, depth:boxDepth});
  left.movable = false;
  left.x = -(boxWidth+boxThickness)/2
  Away3dMesh(left.skin).mesh.material = wallTexture
  
  var right:RigidBody = physics.createCube({width:boxThickness, height:boxHeight, depth:boxDepth});
  right.movable = false;
  right.x = (boxWidth+boxThickness)/2
  Away3dMesh(right.skin).mesh.material = wallTexture
  
  var front:RigidBody = physics.createCube({width:boxWidth, height:boxHeight, depth:boxThickness});
  front.movable = false;
  front.z =  (boxDepth+boxThickness)/2
  Away3dMesh(front.skin).mesh.material = wallTexture
  
  var back:RigidBody = physics.createCube({width:boxWidth, height:boxHeight, depth:boxThickness});
  back.movable = false;
  back.z = -(boxDepth+boxThickness)/2
  Away3dMesh(back.skin).mesh.material = wallTexture
  
  var ground:RigidBody = physics.createCube({width:boxWidth, height:boxThickness, depth:boxDepth, segmentsW:2, segmentsH:2});
  ground.movable = false;
  ground.y = -(boxHeight+boxThickness)/2
  Away3dMesh(ground.skin).mesh.material = groundTexture
  Away3dMesh(ground.skin).mesh.pushback = true
}

function createDice():void {
  var dice:RigidBody = physics.createCube({width:diceScale, height:diceScale, depth:diceScale});
  dice.y=500
  dice.movable=true
  Cube(Away3dMesh(dice.skin).mesh).cubeMaterials.left = diceTextures[0]
  Cube(Away3dMesh(dice.skin).mesh).cubeMaterials.right = diceTextures[1]
  Cube(Away3dMesh(dice.skin).mesh).cubeMaterials.front = diceTextures[2]
  Cube(Away3dMesh(dice.skin).mesh).cubeMaterials.back = diceTextures[3]
  Cube(Away3dMesh(dice.skin).mesh).cubeMaterials.top = diceTextures[4]
  Cube(Away3dMesh(dice.skin).mesh).cubeMaterials.bottom = diceTextures[5]
  dices.push(dice)
}

function resetAllDices(e:Event):void {
  for(var i:int = 0; i<dices.length; i++) {
    dices[i].moveTo( new JNumber3D( 0, 100 + i*(diceScale+10) , 0 ) )
    addRandomForce(dices[i])
  }
}
function resetOnlyPositions():void {
  for(var i:int = 0; i<dices.length; i++) {
    dices[i].moveTo( new JNumber3D( 0, 100 + i*(diceScale+10) , 0 ) )
  }
}
function addRandomForce(rigid:RigidBody) {
  
  var forceX:Number =  50 + Math.random()*( diceRandomForce )
  var forceY:Number =  50 + Math.random()*( diceRandomForce )
  var forceZ:Number =  50 + Math.random()*( diceRandomForce )
  
  rigid.addBodyForce(new JNumber3D(forceX,forceY,forceZ) , new JNumber3D( rigid.x + diceScale ,rigid.y,rigid.z) )
  rigid.addBodyForce(new JNumber3D(-forceX,-forceY,-forceZ) , new JNumber3D(rigid.x - diceScale,rigid.y,rigid.z) )
  
}

function initListeners():void {
  stage.addEventListener(Event.ENTER_FRAME, render);
  stage.addEventListener(MouseEvent.MOUSE_DOWN,resetAllDices)
}

function render( e:Event ):void {
  view.render();
  camera.targetpanangle = stage.mouseX/stage.stageWidth*360
  camera.targettiltangle = stage.mouseY/stage.stageHeight*30
  camera.hover();
  physics.step();
  
  light.x = camera.x
  light.y = camera.y
  light.z = camera.z
}

initAway3D();
createWalls();
createDice();
createDice();
resetOnlyPositions()
initListeners();
// Adapted from: http://code.tutsplus.com/tutorials/throwing-dice-with-the-jiglib-physics-engine-and-away3d--active-1956
Actionscript 3 source code based on the JigLib physics engine
Slide 1

The JigLib physics engine is based on the following paper entitled "Nonconvex Rigid Bodies with Stacking"

Guendelman, E., Bridson, R., & Fedkiw, R. (2003). Nonconvex rigid bodies with stacking. ACM Transactions on Graphics, 22(3), 871. https://doi.org/10.1145/882262.882358
Exit full screenEnter Full screen
PREV
NEXT
Shadow
https://christopher-germann.de/wp-content/uploads/quantum-dice-bose-einstein-statistics.swf
Germann, C. B. (2015). Einstein and the Quantum: The Quest of the Valiant Swabian by A. Douglas Stone (review). Leonardo 48(2), 208-209. The MIT Press. Available from Project MUSE database: https://muse.jhu.edu/article/577891

Just two years before Einstein famously rejected quantum mechanics with the memorable phrase “I am convinced that [God] is not playing at dice” Einstein himself, inspired by Satyendra Nath Bose, changed the probabilistic laws that govern the playing of dice.

While presenting a lecture at the reputable University of Dhaka on the theory of radiation and the ultraviolet catastrophe, Bose intended to show his students that the contemporary theory was inadequate, because it predicted results not in accordance with experimental results (Venkataraman, 1992, p.14). In the process of describing this discrepancy, Bose for the first time took the position that the Maxwell–Boltzmann distribution would not be true for microscopic particles.
Bose adapted this lecture into a short article called “Planck’s Law and the Hypothesis of Light Quanta” and sent it to Albert Einstein with the following letter:


Respected Sir,
I have ventured to send you the accompanying article for your perusal and opinion. I am anxious to know what you think of it. You will see that I have tried to deduce the coefficient 8π ν2/c3 in Planck’s Law independent of classical electrodynamics, only assuming that the ultimate elementary region in the phase-space has the content h3. I do not know sufficient German to translate the paper. If you think the paper worth publication I shall be grateful if you arrange for its publication in Zeitschrift für Physik. Though a complete stranger to you, I do not feel any hesitation in making such a request. Because we are all your pupils though profiting only by your teachings through your writings. I do not know whether you still remember that somebody from Calcutta asked your permission to translate your papers on Relativity in English. You acceded to the request. The book has since been published. I was the one who translated your paper on Generalised Relativity.



When Einstein later met Bose face-to-face, he asked him whether he had been aware that he had invented a new type of statistics, Bose candidly said that no, he wasn’t that familiar with Boltzmann’s statistics and didn’t realize that he was doing the calculations differently.

Partly adapted from Stone (2013); Chapter 24,”The Indian Comet,” p. 215.

Games of chance (e.g., coins, dice, or cards) are all based on the same underlying statistical principle: each specific configuration of the basic units (e.g., heads vs. tails, throwing a six vs. a 3, Ace vs. King, etc.) is equally likely.
The atomic world behaves like a huge number of many-faced dice, constantly being rolled and rerolled. In fact, Bose’s combinatorial formula is essentially a statement about the number of states available when a huge number of many-faced dice are thrown.
Consider the example of throwing two dice: The available configurations are naturally specified by a pair of numbers, the number facing upwards on die one and the number facing upwards on die two. For example (3,5) is a specific configuration in which die one shows a 3 and die two shows a 5. Each of the thirty-six possible pairs [(1,1),(1,2),(2,1),…(5,6),(6,6)] is then equally likely to occur. However, the statistics gets somewhat more interesting when one looks, not at a specific configuration, but at the total score in a throw, the sum of the two numbers defining a configuration. Now one quickly realizes that there are six configurations adding up to seven (i.e., six ways to roll a seven) and there is only one way to roll a two. Thus, the chance of rolling a seven is 6/36, and of rolling a two is 1/36. These calculations, and all other statistical properties of dice, follow directly from the fact that there are two distinct, independent dice, each of which randomly shows one of its faces when thrown, and that each throw is independent.

6,1
5,1 5,2 6,2
4,1 4,2 4,3 5,3 6,3
3,1 3,2 3,3 3,4 4,4 5,4 6,4
2,1 2,2 2,3 2,4 2,5 3,5 3,5 5,5 6,5
1,1 1,2 1,3 1,4 1,5 1,6 2,6 3,6 4,6 5,6 6,6
2 3 4 5 6 7 8 9 10 11 12
1/36 2/36 3/36 4/36 5/36 6/36 5/36 4/36 3/36 2/36 1/36
Table 1. Probability distribution for “classical dice.”

Now if you have a pair of different colored dice (die one is red die two is blue) and you keep track as you roll many times, you will surely find that (red=3, blue=4) and (red=4 and blue=3) occur roughly an equal number of times, and you can tell that some of your sevens come from (3,4) and some from (4,3). However, suppose someone makes a pair of dice so perfectly matched that they are completely identical to your eye, and you put the dice in a closed box and shake them before making a throw. In this case every time you get a four and a three you will not be able to tell whether it is (3,4) or (4,3). Do you expect this to make any difference in the probability of getting a seven? Absolutely not. This probability is a law of physics: there are two distinct, independent physical possibilities, which the laws of dynamics may or may not lead to in a given roll, and we must add the probabilities for each to occur to get the right answer. It matters not at all if we can tell which possibility occurred. What, then, about the behaviour of two atoms (or electrons) being distributed by some microscopic dynamics into, say, six different quantum energy levels. The two atoms are then like two “quantum dice” and the energy level each atom occupies is analogous to the face of the die that comes up. If atoms are independent, distinct objects, no matter how much they look identical, one would have to conclude that having atom one in level three, and atom two in level four, is a different possibility from atom one in level four and atom two in level three. And therefore that both possibilities must both contribute to the number of possible states (both contribute to the entropy of the system). One would be wrong.
This is the mind bending, if unappreciated, assumption behind Bose’s method of counting light quanta, which Einstein adopted for atoms and which he must have fully grasped only sometimes after his first paper on the atomic ideal gas. The new principle is that, in the atomic realm, the interchanging of the role of two identical particles does not lead to a distinct physical state. This has nothing to do with whether a physicist chooses to regard these states as the same, or does not know how to distinguish them: they are not distinct. This is an ontological and not an epistemological assertion.
How do we know this: Consider again our quantum dice. According to Bose-Einstein statistics, there are now only twenty-one possible configurations, not thirty-six. The six doubles are still as before [(1,1),(2,2)…]. The number of these states didn’t change when we switched over to the quantum dice, even with classical statistics there is only one way to get snake eyes, or double deuces, etcetera. But now for the thirty other configurations, where the two numbers are different, we identify them pairwise, leaving only fifteen. Configurations (3,4) and (4,3) are merged into a single identity of “three-four-and-four-threeness,” and similarly for all the other unlike pairs. Now, suddenly, our dice behave differently. Instead of seven being the most likely score, six, seven, and eight are all equally likely and have a probability of 1/7 of occurring. (With the new rules one might be tempted to sneak a pair of quantum dice into a casino and make a killing).

3,3 3,4 4,4
2,2 2,3 2,4 2,5 3,5 3,5 5,5
1,1 1,2 1,3 1,4 1,5 1,6 2,6 3,6 4,6 5,6 6,6
2 3 4 5 6 7 8 9 10 11 12
1/21 2/21 2/21 2/21 3/21 3/21 3/21 2/21 2/21 1/21 1/21
Table 2. Probability distribution for “quantum dice.”

But there is further change in the probabilities, which has profound significance in physics. With the Bose-Einstein approach, the probability of rolling a doubles has greatly increased. Classically the probability of rolling doubles in 6/36=1/6=16.6%; switching to the quantum dice makes it 6/21=28.5%, increasing the odds of doubles by more then 70%. With Bose-Einstein statistics there are fewer configurations available in which in which the particles do different things, and as a result the particles have the tendency to bunch together in the same states! And the more particles there are the more there is a tendency to bunch. For three quantum dice the probability of rolling triples is more than twice as large as it would be if the classical statistics of distinguishable dice held sway. With a trillion trillion quantum particles, as in a mole of gas, this effect is enormous, it literally changes the behaviour of matter.
Fine, but do we really care that much about what happens when you swap atoms. Well, we should. Because it is very hard to think of atoms as particles in the usual everyday sense when they lack this individuality. After all, just as we could imagine painting one die red and the other blue (i.e., labelling them), can’t we somehow label atom one and atom two? No, we can’t (according to Einstein). Atoms are fundamentally indistinguishable and impossible to label. Nature is such that they are not separate entities, with their own independent trajectories through space and time. They exist in an eerie, fuzzy state of oneness when aggregated. So the Bose-Einstein statistical worldview, coming from different directions, reinforces the concept of wave-particle duality, in this case applied to both light and matter, and heralds the emerging discovery that the microscopic world exists in a bizarre mixture of potentiality and actuality.

Partly adapted from Stone (2013); Chapter 25. “Quantum Dice,” p. 228; 231-233.

References

Stone, A. (2013). Einstein and the quantum: The quest of the valiant Swabian. Princeton: Princeton University Press.

Venkataraman, G. (1992). Bose and his statistics. Hyderabad: Universities Press.

See also:

Peña. & Cetto, A. (1996). The quantum dice: An introduction to stochastic electrodynamics. Dordrecht Boston: Kluwer Academic Publishers.

Ponomarev, L. (1993). The quantum dice. Bristol Philadelphia: Institute of Physics Publishing.

AS3 source code

var loader:URLLoader = new URLLoader(new URLRequest("https://christopher-germann.de/wp-content/uploads/quantum-dice.txt"));
loader.addEventListener(Event.COMPLETE, completeHandler);

function completeHandler(event:Event):void {
    var loadedText:URLLoader = URLLoader(event.target);
	myText_txt.htmlText = loadedText.data;
}

import away3d.cameras.*;
import away3d.containers.*;
import away3d.materials.*;
import away3d.primitives.*
import away3d.lights.DirectionalLight3D

import jiglib.physics.RigidBody;
import jiglib.plugin.away3d.Away3DPhysics;
import jiglib.plugin.away3d.Away3dMesh;
import jiglib.math.JNumber3D


var scene:Scene3D;
var camera:HoverCamera3D;
var view:View3D;
var light:DirectionalLight3D;
var physics:Away3DPhysics;


var boxWidth:Number = 250
var boxHeight:Number = 30
var boxDepth:Number = 250
var boxThickness:Number = 5

var diceTextures:Array = [ new WhiteShadingBitmapMaterial( new diceTexture1(0,0) ),
						   new WhiteShadingBitmapMaterial( new diceTexture2(0,0) ),
						   new WhiteShadingBitmapMaterial( new diceTexture3(0,0) ),
						   new WhiteShadingBitmapMaterial( new diceTexture4(0,0) ),
						   new WhiteShadingBitmapMaterial( new diceTexture5(0,0) ),
						   new WhiteShadingBitmapMaterial( new diceTexture6(0,0) ) ]
						   
												

var wallTexture:WhiteShadingBitmapMaterial = new WhiteShadingBitmapMaterial( new walltexture(0,0))
var groundTexture:WhiteShadingBitmapMaterial = new WhiteShadingBitmapMaterial( new groundtexture(0,0))

var diceScale:Number = 30
var dices:Array = new Array()
var diceRandomForce:Number = 50

function initAway3D():void {
	scene = new Scene3D();

	camera = new HoverCamera3D();
	camera.distance = 500

	light = new DirectionalLight3D({color:0xFFFFFF, ambient:0.25, diffuse:0.75, specular:0.9})
	scene.addChild(light)
	
	view=new View3D({scene:scene,camera:camera});
	view.x=stage.stageWidth/2;
	view.y=stage.stageHeight/2;
	addChild(view);
	
	physics = new Away3DPhysics(view,4)
	
}

function createWalls():void {
	var left:RigidBody = physics.createCube({width:boxThickness, height:boxHeight, depth:boxDepth});
	left.movable = false;
	left.x = -(boxWidth+boxThickness)/2
	Away3dMesh(left.skin).mesh.material = wallTexture
	
	var right:RigidBody = physics.createCube({width:boxThickness, height:boxHeight, depth:boxDepth});
	right.movable = false;
	right.x = (boxWidth+boxThickness)/2
	Away3dMesh(right.skin).mesh.material = wallTexture
	
	var front:RigidBody = physics.createCube({width:boxWidth, height:boxHeight, depth:boxThickness});
	front.movable = false;
	front.z =  (boxDepth+boxThickness)/2
	Away3dMesh(front.skin).mesh.material = wallTexture
	
	var back:RigidBody = physics.createCube({width:boxWidth, height:boxHeight, depth:boxThickness});
	back.movable = false;
	back.z = -(boxDepth+boxThickness)/2
	Away3dMesh(back.skin).mesh.material = wallTexture
	
	var ground:RigidBody = physics.createCube({width:boxWidth, height:boxThickness, depth:boxDepth, segmentsW:2, segmentsH:2});
	ground.movable = false;
	ground.y = -(boxHeight+boxThickness)/2
	Away3dMesh(ground.skin).mesh.material = groundTexture
	Away3dMesh(ground.skin).mesh.pushback = true
}

function createDice():void {
	var dice:RigidBody = physics.createCube({width:diceScale, height:diceScale, depth:diceScale});
	dice.y=500
	dice.movable=true
	Cube(Away3dMesh(dice.skin).mesh).cubeMaterials.left = diceTextures[0]
	Cube(Away3dMesh(dice.skin).mesh).cubeMaterials.right = diceTextures[1]
	Cube(Away3dMesh(dice.skin).mesh).cubeMaterials.front = diceTextures[2]
	Cube(Away3dMesh(dice.skin).mesh).cubeMaterials.back = diceTextures[3]
	Cube(Away3dMesh(dice.skin).mesh).cubeMaterials.top = diceTextures[4]
	Cube(Away3dMesh(dice.skin).mesh).cubeMaterials.bottom = diceTextures[5]
	dices.push(dice)
}

function resetAllDices(e:Event):void {
	for(var i:int = 0; i<dices.length; i++) {
		dices[i].moveTo( new JNumber3D( 0, 100 + i*(diceScale+10) , 0 ) )
		addRandomForce(dices[i])
	}
}
function resetOnlyPositions():void {
	for(var i:int = 0; i<dices.length; i++) {
		dices[i].moveTo( new JNumber3D( 0, 100 + i*(diceScale+10) , 0 ) )
	}
}
function addRandomForce(rigid:RigidBody) {
	
	var forceX:Number =  50 + Math.random()*( diceRandomForce )
	var forceY:Number =  50 + Math.random()*( diceRandomForce )
	var forceZ:Number =  50 + Math.random()*( diceRandomForce )
	
	rigid.addBodyForce(new JNumber3D(forceX,forceY,forceZ) , new JNumber3D( rigid.x + diceScale ,rigid.y,rigid.z) )
	rigid.addBodyForce(new JNumber3D(-forceX,-forceY,-forceZ) , new JNumber3D(rigid.x - diceScale,rigid.y,rigid.z) )
	
}

function initListeners():void {
	stage.addEventListener(Event.ENTER_FRAME, render);
	stage.addEventListener(MouseEvent.MOUSE_DOWN,resetAllDices)
}

function render( e:Event ):void {
	view.render();
	camera.targetpanangle = stage.mouseX/stage.stageWidth*360
	camera.targettiltangle = stage.mouseY/stage.stageHeight*30
	camera.hover();
	physics.step();
	
	light.x = camera.x
	light.y = camera.y
	light.z = camera.z
}

initAway3D();
createWalls();
createDice();
createDice();
resetOnlyPositions()
initListeners();
// Adapted from: http://code.tutsplus.com/tutorials/throwing-dice-with-the-jiglib-physics-engine-and-away3d--active-1956

The JigLib physics engine is based on the following paper entitled “Nonconvex Rigid Bodies with Stacking”

Guendelman, E., Bridson, R., & Fedkiw, R.. (2003). Nonconvex rigid bodies with stacking. ACM Transactions on Graphics, 22(3), 871.

Plain numerical DOI: 10.1145/882262.882358
DOI URL
directSciHub download

Top Skip to content