Rubik's Cube Help!

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
10 messages Options
Reply | Threaded
Open this post in threaded view
|

Rubik's Cube Help!

balajim
Hi,

We are trying to build a Rubik's Cube in Croquet. We just started working with Croquet, so still trying to find our feet in the environment. We can't seem to figure out how to make one part of the cube rotate. Are there any existing classes that do this that we can take a look at?

Thanks,
Balaji
Reply | Threaded
Open this post in threaded view
|

Re: Rubik's Cube Help!

David A. Smith
I would switch to the Virtual World Framework (this is really Croquet 2.0). You can code it in Javascript and it is much easier to deploy - totally web-centric. And I designed that one too.
Regards,
David


On Fri, Apr 19, 2013 at 7:00 PM, balajim <[hidden email]> wrote:
Hi,

We are trying to build a Rubik's Cube in Croquet. We just started working
with Croquet, so still trying to find our feet in the environment. We can't
seem to figure out how to make one part of the cube rotate. Are there any
existing classes that do this that we can take a look at?

Thanks,
Balaji



--
View this message in context: http://forum.world.st/Rubik-s-Cube-Help-tp4682659.html
Sent from the Croquet - Dev mailing list archive at Nabble.com.



--
David A. Smith
Picture
Reply | Threaded
Open this post in threaded view
|

Re: Rubik's Cube Help!

balajim
Thank You for replying, David.

But we are actually constrained by the language. We have just learnt Smalltalk so we are trying to figure out how to implement it in Smalltalk.

Balaji

Reply | Threaded
Open this post in threaded view
|

Re: Rubik's Cube Help!

David A. Smith
No problem. I wrote Croquet, so might be able to help there too.
David


On Fri, Apr 19, 2013 at 7:22 PM, balajim <[hidden email]> wrote:
Thank You for replying, David.

But we are actually constrained by the language. We have just learnt
Smalltalk so we are trying to figure out how to implement it in Smalltalk.

Balaji





--
View this message in context: http://forum.world.st/Rubik-s-Cube-Help-tp4682659p4682662.html
Sent from the Croquet - Dev mailing list archive at Nabble.com.



--
David A. Smith
Picture
Reply | Threaded
Open this post in threaded view
|

Re: Rubik's Cube Help!

sachuraju
I'm working with Balaji to get the Rubik's cube implemented in Croquet Smalltalk. I'm posting a few questions and hoping to get them answered. I'm still new to the framework and therefore would appreciate some detailed responses to my questions.

This is the way we are imagining to get this done.

Step 1 : figure out a way to rotate a cube around a point in the world, which is not the center of the cube itself. (This would be like planets rotating around the sun)
I understand that, to do this, we first need to translate the object to the point, rotate it there, and translate it back, which gives the effect of rotation around a point. I'm having trouble to figure out what existing classes should I leverage that might already do this.

Step 2 : After step 1 - we need a way to select all the cubes in a plane so that rotating one, causes rotation of all the cubes in the plane.  

Step 3 : we need a way to combine 1 and 2 to actually get the rotation for all cubes.
Reply | Threaded
Open this post in threaded view
|

Re: Rubik's Cube Help!

David A. Smith
Step 1 is basically right. Once you formulate the actual equation, you can combine it all into a single matrix if you do it a lot. Easier to do the following:
Step 2 - create a TFrame at the center of where you want to rotate around. You can place this TFrame anywhere you like in the world. Add the elements of the cube into the TFrame.
Step 3 - more difficult if you want to have each cube move somewhat independently the way a Rubik's cube does. I wrote a method that computes the transform matrix from one object to another. This allows you to perform a rotation around the other object or TFrame. I don't remember the actual method name though. 

David


On Fri, Apr 19, 2013 at 8:26 PM, sachuraju <[hidden email]> wrote:
I'm working with Balaji to get the Rubik's cube implemented in Croquet
Smalltalk. I'm posting a few questions and hoping to get them answered. I'm
still new to the framework and therefore would appreciate some detailed
responses to my questions.

This is the way we are imagining to get this done.

Step 1 : figure out a way to rotate a cube around a point in the world,
which is not the center of the cube itself. (This would be like planets
rotating around the sun)
I understand that, to do this, we first need to translate the object to the
point, rotate it there, and translate it back, which gives the effect of
rotation around a point. I'm having trouble to figure out what existing
classes should I leverage that might already do this.

Step 2 : After step 1 - we need a way to select all the cubes in a plane so
that rotating one, causes rotation of all the cubes in the plane.

Step 3 : we need a way to combine 1 and 2 to actually get the rotation for
all cubes.



--
View this message in context: http://forum.world.st/Rubik-s-Cube-Help-tp4682659p4682666.html
Sent from the Croquet - Dev mailing list archive at Nabble.com.



--
David A. Smith
Picture
Reply | Threaded
Open this post in threaded view
|

Re: Rubik's Cube Help!

sachuraju
Thank you for the reply, David. I'll go ahead and try it. I would also appreciate your inputs on the following.

It seems to me that we may be thinking at a lower level of abstraction than we ought to.

The rotation around a point is not necessarily a property of a single cube, but all the cubes in the plane in which I want the rotations to happen. So,

1) Would it be easier to define a container class, (such as a subclass of TGroup), that can contain cubes and have rotation as a property of the container class itself? This way, we don't have to worry about single-cube rotations.

2) If we do implement such a container class, we'll need to make such a container class dynamic since after a rotation, the cubes shift their positions. So if I do a rotation around y-axis, then the cubes would change their planes in the x-axis and z-axis.

Would it be any easier, given the classes in croquet, than my previous approach?
Reply | Threaded
Open this post in threaded view
|

Re: Rubik's Cube Help!

David A. Smith
Probably not. Rubik's cubes are necessarily complex in their transformations. I think you really just want to treat each sub-cube as an independent entity when you do its transform. The nice thing is that all the cubes in that plane should undergo the same transform (newMatrix = transform*oldMatrix or something like that for all 9 cubes in that plane...)
David


On Sun, Apr 21, 2013 at 12:46 PM, sachuraju <[hidden email]> wrote:
Thank you for the reply, David. I'll go ahead and try it. I would also
appreciate your inputs on the following.

It seems to me that we may be thinking at a lower level of abstraction than
we ought to.

The rotation around a point is not necessarily a property of a single cube,
but all the cubes in the plane in which I want the rotations to happen. So,

1) Would it be easier to define a container class, (such as a subclass of
TGroup), that can contain cubes and have rotation as a property of the
container class itself? This way, we don't have to worry about single-cube
rotations.

2) If we do implement such a container class, we'll need to make such a
container class dynamic since after a rotation, the cubes shift their
positions. So if I do a rotation around y-axis, then the cubes would change
their planes in the x-axis and z-axis.

Would it be any easier, given the classes in croquet, than my previous
approach?



--
View this message in context: http://forum.world.st/Rubik-s-Cube-Help-tp4682659p4682869.html
Sent from the Croquet - Dev mailing list archive at Nabble.com.



--
David A. Smith
Picture
Reply | Threaded
Open this post in threaded view
|

Re: Rubik's Cube Help!

sachuraju
Ok..

I'm now trying to arrive at the transformation matrix that will give me the required rotation, and this is what I've come up with. It isn't working as I expect it to.


rotateBy: anAngle aroundX: xValue y: yValue z: zValue              
"xyz is the point around which I want to rotate the object. I'll call it the origin"

    prevTrans := localTransform translation.
    "store the current position of the object"

    diffTrans := (Vector3 x: xValue y:yValue z:zValue) - prevTrans.  
    "Get the difference between origin and current position"

    transformMatrix  := Matrix4x4 identity.
    "To build the transformation matrix, start with the identity"

    transformMatrix  addTranslation: diffTrans.
    "add transformation to translate the object to the origin"

    transformMatrix  := transformMatrix rotation: anAngle aroundX:xValue y:yValue z:zValue.
    "add transformation to rotate the object by some angle at the origin"

    transformMatrix addTranslation: (diffTrans negated).
    "add transformation to translate the object to its new position"
       
    localTransform := transformMatrix * localTransform.
    "using the generate transformation matrix to apply the transformation to the object's localTransform".

With this, I was really expecting to get the desired result but am not getting it. What am I missing here?
Reply | Threaded
Open this post in threaded view
|

Re: Rubik's Cube Help!

sachuraju
Ok. I think I figured it out.

I was using the wrong rotation function.
It works now when I use the existing rotationAroundX:, rotationAroundY:, rotationAroundZ:
functions.