• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.


  • Content count

  • Joined

  • Last visited

Community Reputation

129 Neutral

About FireViper

  • Rank
  1. thanks for clearing everything up. I will check out the article.
  2. thanks for the reply serumas, I have a few questions. On the move function, is 'air' a float? Also, what does the 'satisfy_all_objects_constraints' function do?
  3. I recently read an article on Verlet integration ([url="http://lol.zoy.org/blog/2011/12/14/understanding-motion-in-games"]http://lol.zoy.org/b...motion-in-games[/url]) and wanted to apply it. It seems to work, but I'm not sure how to use it with my collision detection code. My update function looks something like this: [source lang="cpp"]void State::Update(float dt) { Vector accel = Vector(...) //get accelreation based on user input Vector oldVel = vel; vel += (accel) * dt; pos += (oldVel + vel) * 0.5 * dt; if( if_collision_is_enabled ) { Vector newpos = CollideWithWorld(pos,vel); //get new position //update velocity & position based on the new position vel = newpos - pos; pos = newpos; } }[/source] It seems to work, but the movement isnt as smooth as it is without collision. I assume I'm not updating the velocity and position correctly after the collision. Does anyone know a better way to do this?
  4. OpenGL

    thanks for the reply, I swapped the rows and its working.
  5. I'm trying to load jpg files using jpeglib, and found this example ([url="http://www.efkhoury.com/content/opengl-jpeg-texture-loader-using-ijg-libjpeg"]http://www.efkhoury....ing-ijg-libjpeg[/url]) I got it to work but the textures are being rendered incorrectly. I have to open them using mspaint, rotate them 180 degrees and flip them horizontally, in order for them to render correctly. I noticed the same thing happened when I tried to load png files. After searching google, I found out I have to swap the rows of the texture buffer before loading it in to opengl. However, I couldn't to find any code (or pseudo code) on it. If someone could tell me how to do this, it would be great. This is the function I'm using to load the texture: [code] unsigned char* LoadJPG(const string& filename, int& width,int& height, int& nChannel) { unsigned char * big_buff; struct jpeg_decompress_struct cinfo; struct my_error_mgr jerr; FILE * infile; JSAMPARRAY buffer; int row_stride; if ((infile = fopen(filename.data(), "rb")) == NULL) return NULL; cinfo.err = jpeg_std_error(&jerr.pub); jerr.pub.error_exit = my_error_exit; if (setjmp(jerr.setjmp_buffer)) { jpeg_destroy_decompress(&cinfo); fclose(infile); return NULL; } jpeg_create_decompress(&cinfo); jpeg_stdio_src(&cinfo, infile); (void) jpeg_read_header(&cinfo, TRUE); (void) jpeg_start_decompress(&cinfo); row_stride = cinfo.output_width * cinfo.output_components; buffer = (*cinfo.mem->alloc_sarray) ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); big_buff = (unsigned char*)malloc(cinfo.output_height * cinfo.output_width * cinfo.output_components); while (cinfo.output_scanline < cinfo.output_height) { JDIMENSION read_now = jpeg_read_scanlines(&cinfo, buffer, 1); memcpy(&big_buff[(cinfo.output_scanline - read_now) * cinfo.output_width * cinfo.output_components], buffer[0], row_stride); } width = cinfo.output_width; height = cinfo.output_height; nChannel = cinfo.num_components; (void) jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); fclose(infile); return big_buff; } [/code]
  6. thanks for the reply oliii.I know there are a lot of articles on the net about sphere-to-sphere collision, but the part that confuses me is changing vector spaces. In this article, all points (basePoint, velocity, and the 3 triangle points) are scaled by eSpace before the collisionPoint is detected. When I test against a sphere, do I have to scale the sphere's position and radius as well?
  7. I've recently read the Improved Collision detection and Response article, and implemented player-vs-world collision system. I was wondering what is the best way to do play-vs-play collision? Since the "Collision Response" part of the algorithm only needs an intersectionPoint and intersectionDistance, I assume the only thing that needs to change is "Collision Detection" part. If one of the player is defined as a unit sphere(after being scaled by the Ellipsoid Vector Space) and the other player is an ellipsoid (assuming it doesn't have the same radii as the first player) what is the best way to determine if an intersection has occurred, and if so, find the intersection point?
  8. ok, let me clarify a few things. Each Bone has: Parent - A pointer to its parent length - (float) the length of the bone Rotation/Position - (vector) The Rotation and Position Direction - (vector) Bone's Direction Transform - The Transformation Matrix InverseBind - The Inverse of Transform in the reference pose Start/End - The Start and End points of the bone This is the code I use to move a Bone. void bone::Set() { //Calculate Bone's Relative Matrix Transform = matrix4(); //Set Transform to its Identity Transform.SetRotation( Rotation ); //If parent exist if(Parent!=NULL) //Combine Relative Matrix with Parent's Matrix to form Absolute Matrix Transform = Transform * Parent->Transform; //Calculate Bone's orientation vector3 tempVec = (Direction * length) * Transform; if(Parent!=NULL) Start = Parent->End; else Start = vector3(); End = Start + tempVec; } The only translation I see here is the distance from Start to End, which is calculated in tempVec. Are you saying I should combine this with the Transformation Matrix?
  9. I get what you'er saying, but Im not sure how to do it. I mean I know I have to translate the matrix by a certain point, then rotate it, and translate it back, but I'm not sure how to calculate the translation?
  10. Quote:So for a point attached to the hand, the matrices should have some translation at least. The only thing Im doing to the bones are rotating them, where does the translation come from? Are you referring to the distance from the start of the bone to the end as the translation?
  11. noone know what Im doing wrong? well any suggestions would be appreciated.
  12. I've read a few articles (and skimmed through a bunch of posts) about CPU skinning. I've tried to implement it for a while, but it just doesn't seems to work for me. I know that the equation looks something like this, v' = sum( Weight[i] * TransformMatrix[i] * ReferencePose[i]^-1 ) * v; But when I try to implement this on a single point, it fails. Below are 2 screen shots I took. The first pic is a skeleton in its reference pose, with left arm rotated at -90 degrees in the z axis, and the right arm rotated in 90 degrees in the z axis. and the blue point is a vertex of a mesh, its coords are (19.426800, 9.168850, 0.129585) the second pic is the skeleton's right arm is in its default pose, where all its matrices are set to their identities. since the blue point is at the edge, I assume its under the influence of just 1 bone. So I don't have to calculate the sum of the weights, I just calculate: v'= TransformMatrix * ReferencePose^-1 * v where: v = (19.426800, 9.168850, 0.129585) TransformMatrix = Identity Matrix ReferencePose^-1 = the inverse matrix of 90 degrees in the z axis And when I compute the result, I get v'=(9.168850, -19.426800, 0.129585) As you can see in the second pic, that is not where v' should be. Any ideas on what I'm doing wrong?
  13. Quote:Original post by emeyex 2) ensure your Bone[i].InverseBind is correct (after you compute the inverse of the reference pose, invert the matrix again and ensure it's "equal" to the reference pose) well Im not sure if it makes a difference, but the way I calcualte the Inverse matrix is, during the Binding function, I loop through all the bones, Set the Inverse matrix to the Transpose of the Bone's Transform matrix. However, thats shouldnt really matter, because when i multiply the Transform by its Inverse, I get its Identity. Quote: I'll think a little longer and re-post if anything else jumps out at me. Thanks, that would really help.
  14. Well you didnt confuse me....much. I tried to do what you said, but I the same results. Here my rendering code: int maxBones; int maxTri; //maxTriangles Bones[maxBones]; //Holds Transform & Inverse matrix VertSkin[maxTri]; //Class holds skin influence data (bone IDs & Weights) matrix4 SkinMat[maxBones]; // skinning matrix vector3 Vertex[maxVertices]; //holds list of vertices (float x,y,z) polygon Polygon[maxTri]; //holds triangle indices (int a,b,c) for(i=0; i < maxBones; i++) //loop through i'th bones { //Calculate skinning matrix SkinMat[i] = Bone[i].Transform * Bone[i].InverseBind; } for(i=0; i<maxTri; i++) //Loop through i'th triangles { vector3 v1 = Vertex[Polygon[i].a]; //untransformed point int maxInfluences; //# of bones that influence v matrix4 M; //holds sum of weights //loop through j'th weights for(int j=0; j < maxInfluences; j++) { int boneID = VertSkin[ Polygon[i].a ].ID[j]; float weight = VertSkin[ Polygon[i].a ].Weight[j]; if(j==0) M = SkinMat[ boneID ] * weight; else M = M+(SkinMat[ boneID ] * weight); } //transform v1 by the sum of all weights v1 = M * v1; ... // Calculate v2 & v3 ... // Render Triangle } Im not sure if im making a mistake in the rendering code, or my matrix multiplication code. Heres a screenshot of simple skinned mesh in its reference pose: And here is a screenshot once i rotate the arm bones,
  15. Quote:Original post by emeyex v' = sum_for_each_vertex_weight_i( W[i] * Mref[ B[i] ]^-1 * M[ B[i] ] ) * v; so the program would loop through the number of weights influenced by the vertex, multiply (float)W[i] with (matrix4x4)Mref[ B[i] ]^-1, which would give another 4x4 matrix, which is then multipled by M[ B[i]], and the result is stored in another matrix, which is multiplied by v when the loop ends. Alright, I think I got it, but its been a while since I did matrix math, and can't remember how to multiply a float to matrix. So when I multiply W[i] * Mref[ B[i] ]^-1, I just scale all of Mref[ B[i] ]'s values by W[i]?