Can't get the Camera inverse matrix...



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 13/06/2003 at 07:56, xxxxxxxx wrote:

    Ha, sad but true, still using version 6.3. For some reason. MAXON hasn't offered me a free copy of version 7 or version 8. Im still waiting though! :)
    Thanks for the tips. I think something is wrong with either my code or my computer because when I compile the plugin at home it seems to work, but at work it doesn't.
    Matt



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 13/06/2003 at 12:35, xxxxxxxx wrote:

    Ha, sad but true, still using version 6.3. For some reason. MAXON hasn't offered me a free copy of version 7 or version 8. Im still waiting though! :)
    ;)
    Thanks for the tips. I think something is wrong with either my code or my computer because when I compile the plugin at home it seems to work, but at work it doesn't.
    strange. Let us know what the problem was...



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 13/06/2003 at 21:30, xxxxxxxx wrote:

    Ok, this gets stranger.

    If I comment our the code under where it exports the camera, then everything works. In face as long as I comment out the code that exports polygon data, everything works. But as soon a I un-comment that code, the camera no longer will excport (I can't get the inverse matrix) Why would code after the exporting of the camera affect the camera data?

    Matt



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 14/06/2003 at 00:56, xxxxxxxx wrote:

    Unless you're only talking to yourself, which indeed can sometimes be a valuable debugging tool, please post some more code to help us solve the mystery... ;-)



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 14/06/2003 at 07:31, xxxxxxxx wrote:

    You mean you can't read my mind? Maybe the next version of the SDK will include that... Here is some code. I am skipping a lot, but I will try and put the pertinent parts in. Also, remember Im really not much of a programmer, so any help is appreciated.
    It is a menu plugin. At the beginning of the execute function, I define most of the variable that are being used:

        
        
          
        BaseObject *object ;   //holds the object being exported  
        BaseObject *cameraob;  //holds the camera object  
        Vector position;   //holds the position of the object  
        Vector lightcolor;   //holds the color of the light  
        Real intensity;    //holds the intensity of the light  
        Vector sphererad;    //stores the radius of hte primitive sphere  
        Matrix cameramatrix;  //holds the cameras matrix  
        Matrix objectmatrix;  //holds the objects matrix  
        Vector mv0, mv1, mv2, mv3 = 0; //used to save the Transform line in the RIB file  
        BaseContainer data;   //container to hold object container  
        Vector objectcolor;   //hold the color of the object  
        BaseTag *ptag = NULL;  
        BaseChannel *channel = NULL;  //holds the channel of the material  
        BaseContainer chcontainer; //the container of the channel  
        String shaderinfo;   //holds any custom shader defined with the RMShader tag plugin  
        String outputfilename;  
        Bool ok;     //did the export get cancelled...  
        Filename fn;    //holds the filename of the exported file  
        RenderData *rd = NULL;    //holds the render data (resolution, etc)  
        BaseContainer rdc;   //Render Data container  
        
    

    Then, after setting up the export file and writing some preliminary info to it, I get the camera:

        
        
          
        //Camera Options  
        Real fov;  
        cameraob = doc->SearchObject("RenderCamera");  
        if (!cameraob)  
         {   
          MessageDialog("Render camera not found. Looking for camera named RenderCamera.");  
          a_file.close();  
          return;  
        }  
           
        fov = Deg(2 * atan((cameraob->GetAperture()/ 2) / cameraob->GetFocus()));  
        a_file<<"#Camera options\n";  
        cameramatrix = !cameraob->GetMgn();  
        mv0 = cameramatrix.v1;  
        mv1 = cameramatrix.v2;  
        mv2 = cameramatrix.v3;  
        mv3 = cameramatrix.off;  
        
    

    This code works if I comment out the code later on in the source dealing with exporting polygon objects. In fact, I found out last night that it is just the part of the code exporting quads that messes the camera data up, if I leave in the exporting of triangles, everything works. In between the camera export code and the code below is the code for exporting the light data, and all the vraious primities that are supported. Here is the polygon code:

        
        
          
        else if (object->GetType() == Opolygon)  
          {  
           GePrint("Exporting: " + object->GetName());  
           Vector  p;  
           Vector *padr = NULL;  
           Polygon *polyadr=NULL;  
           LONG    i,j,k,pcnt,ptcnt,polycount;  
           LONG *dadr=NULL;  
           Vector normal;  
           Neighbor n;  
           Vector scale = object->GetScale();  
           UVWStruct uv;  
             
           //General Stuff  
           a_file<<"#" << GetText(object->GetName()) << "\n";  
           a_file<<"AttributeBegin\n";  
           if (objectcolor != NULL) a_file<<"Color [" << GetText(RealToString(objectcolor.x)) << " " << GetText(RealToString(objectcolor.y)) << " " << GetText(RealToString(objectcolor.z)) << "]\n";  
           objectmatrix = object->GetMgn();  
           mv0 = objectmatrix.v1;  
           mv1 = objectmatrix.v2;  
           mv2 = objectmatrix.v3;  
           mv3 = objectmatrix.off;  
           if (shaderinfo != "")  
            a_file<<GetText(shaderinfo) << "\n";  
           else  
            a_file<<"Surface \"plastic\"\n";  
           a_file<<"Transform [" << GetText(RealToString(mv0.x)) << " " << GetText(RealToString(mv0.y)) << " " << GetText(RealToString(mv0.z)) << " 0 " << GetText(RealToString(mv1.x)) << " " << GetText(RealToString(mv1.y)) << " " << GetText(RealToString(mv1.z)) << " 0 " << GetText(RealToString(mv2.x)) << " " << GetText(RealToString(mv2.y)) << " " << GetText(RealToString(mv2.z)) << " 0 " << GetText(RealToString(mv3.x/100)) << " " << GetText(RealToString(mv3.y/100)) << " " << GetText(RealToString(mv3.z/100)) << " 1]\n";  
             
            //polygon count and polygon address  
           polyadr = static_cast<PolygonObject*>(object)->GetPolygon();  
           pcnt = static_cast<PolygonObject*>(object)->GetPolygonCount();  
           //point count and point address  
           ptcnt = static_cast<PointObject*>(object)->GetPointCount();  
           padr = static_cast<PointObject*>(object)->GetPoint();  
           //initial normal gathering variables  
           Vector normals = NULL;  
           long dcnt;  
           n.Init(ptcnt,polyadr,pcnt,NULL);  
           //Get UV tag if there is one  
           ptag = object->GetTag(Tuvw);  
             
           //main polygon export loop  
           for (i=0; i<pcnt; i++)  
           {  
            if (polyadr[i].c == polyadr[i].d)   //triangle  
            {  
             a_file<<"Polygon \"P\" [";  
             a_file<<GetText(RealToString(scale.x*padr[polyadr[i].a].x/100) + " " + RealToString(scale.y*padr[polyadr[i].a].y/100) + " " + RealToString(scale.z*padr[polyadr[i].a].z/100) + " ");   
             a_file<<GetText(RealToString(scale.x*padr[polyadr[i].b].x/100) + " " + RealToString(scale.y*padr[polyadr[i].b].y/100) + " " + RealToString(scale.z*padr[polyadr[i].b].z/100) + " ");   
             a_file<<GetText(RealToString(scale.x*padr[polyadr[i].c].x/100) + " " + RealToString(scale.y*padr[polyadr[i].c].y/100) + " " + RealToString(scale.z*padr[polyadr[i].c].z/100) + " ");   
             a_file<<"] \"N\" [";  
              
             //normal for point 1  
             normals = NULL;  
             n.GetPointPolys(polyadr[i].a,&dadr,&dcnt);  
             for(k=0;k<dcnt;k++)  
             {  
              normals += (CalcFaceNormal(padr,polyadr[dadr[k]]));  
             }  
             normals = !((normals)/k);  
             a_file<<GetText(RealToString(normals.x) + " " + RealToString(normals.y) + " " + RealToString(normals.z) + " ");  
               
            //normal for point 2  
             normals = NULL;  
             n.GetPointPolys(polyadr[i].b,&dadr,&dcnt);  
             for(k=0;k<dcnt;k++)  
             {  
              normals += (CalcFaceNormal(padr,polyadr[dadr[k]]));  
             }  
             normals = !((normals)/k);  
             a_file<<GetText(RealToString(normals.x) + " " + RealToString(normals.y) + " " + RealToString(normals.z) + " ");  
               
             //normal for point 3  
             normals = NULL;  
             n.GetPointPolys(polyadr[i].c,&dadr,&dcnt);  
             for(k=0;k<dcnt;k++)  
             {  
              normals += (CalcFaceNormal(padr,polyadr[dadr[k]]));  
             }  
             normals = !((normals)/k);  
             a_file<<GetText(RealToString(normals.x) + " " + RealToString(normals.y) + " " + RealToString(normals.z) + " ");  
             a_file<<"] ";   
               
             if (ptag)  
             {  
              a_file<<"\"st\" [";  
              uv = static_cast<UVWTag*>(ptag)->Get(i);  
              a_file<<GetText(RealToString(uv.a.x) + " " + RealToString(uv.a.y)+ " " + RealToString(uv.b.x)+ " " + RealToString(uv.b.y)+ " " + RealToString(uv.c.x)+ " " + RealToString(uv.c.y) + " ");         
                a_file<<"]\n";  
             }  
            }  
              
            else //quad  
            {  
             a_file<<"Polygon \"P\" [";  
             a_file<<GetText(RealToString(scale.x*padr[polyadr[i].a].x/100) + " " + RealToString(scale.y*padr[polyadr[i].a].y/100) + " " + RealToString(scale.z*padr[polyadr[i].a].z/100) + " ");   
             a_file<<GetText(RealToString(scale.x*padr[polyadr[i].b].x/100) + " " + RealToString(scale.y*padr[polyadr[i].b].y/100) + " " + RealToString(scale.z*padr[polyadr[i].b].z/100) + " ");   
             a_file<<GetText(RealToString(scale.x*padr[polyadr[i].c].x/100) + " " + RealToString(scale.y*padr[polyadr[i].c].y/100) + " " + RealToString(scale.z*padr[polyadr[i].c].z/100) + " ");   
             a_file<<GetText(RealToString(scale.x*padr[polyadr[i].d].x/100) + " " + RealToString(scale.y*padr[polyadr[i].d].y/100) + " " + RealToString(scale.z*padr[polyadr[i].d].z/100) + " ");   
             a_file<<"] \"N\" [";  
          
             //normal for point 1  
             normals = NULL;  
             n.GetPointPolys(polyadr[i].a,&dadr,&dcnt);  
             for(k=0;k<dcnt;k++)  
             {  
              normals += (CalcFaceNormal(padr,polyadr[dadr[k]]));  
             }  
             normals = !((normals)/k);  
             a_file<<GetText(RealToString(normals.x) + " " + RealToString(normals.y) + " " + RealToString(normals.z) + " ");  
          
             //normal for point 2  
             normals = NULL;  
             n.GetPointPolys(polyadr[i].b,&dadr,&dcnt);  
             for(k=0;k<dcnt;k++)  
             {  
              normals += (CalcFaceNormal(padr,polyadr[dadr[k]]));  
             }  
             normals = !((normals)/k);  
             a_file<<GetText(RealToString(normals.x) + " " + RealToString(normals.y) + " " + RealToString(normals.z) + " ");  
          
             //normal for point 3  
             normals = NULL;  
             n.GetPointPolys(polyadr[i].c,&dadr,&dcnt);  
             for(k=0;k<dcnt;k++)  
             {  
              normals += (CalcFaceNormal(padr,polyadr[dadr[k]]));  
             }  
             normals = !((normals)/k);  
             a_file<<GetText(RealToString(normals.x) + " " + RealToString(normals.y) + " " + RealToString(normals.z) + " ");  
          
             //normal for point 4  
             normals = NULL;  
             n.GetPointPolys(polyadr[i].d,&dadr,&dcnt);  
             for(k=0;k<dcnt;k++)  
             {  
              normals += (CalcFaceNormal(padr,polyadr[dadr[k]]));  
             }  
             normals = !((normals)/k);  
             a_file<<GetText(RealToString(normals.x) + " " + RealToString(normals.y) + " " + RealToString(normals.z) + " ");  
             a_file<<"] ";   
             if (ptag) //object has UV coordinates  
             {  
              a_file<<"\"st\" [";  
              uv = static_cast<UVWTag*>(ptag)->Get(i);  
              a_file<<GetText(RealToString(uv.a.x) + " " + RealToString(uv.a.y)+ " " + RealToString(uv.b.x)+ " " + RealToString(uv.b.y)+ " " + RealToString(uv.c.x)+ " " + RealToString(uv.c.y) + " " + RealToString(uv.d.x)+ " " + RealToString(uv.d.y) + " ");         
                a_file<<"]\n";  
             }  
               
            }
    


  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 14/06/2003 at 07:54, xxxxxxxx wrote:

    Hi,
    I haven´t read the complete code but why does the cameramatrix variables take the objectmatrix values later on?
    mv0 = objectmatrix.v1;
       mv1 = objectmatrix.v2;
       mv2 = objectmatrix.v3;
       mv3 = objectmatrix.off;

    if you export the camera information after this it´s logical that it´s messed up for it´s overwritten?



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 14/06/2003 at 11:32, xxxxxxxx wrote:

    Oops, guess I should have put some line breaks in the post above!..
     
    The camera data gets written out and then I reuse the variables for the object matrices. Is that a problem?
    Matt



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/06/2003 at 03:54, xxxxxxxx wrote:

    hi,
    no that shouldn´t be a problem. Have you done some debug sessions already? If not you should do. That way it should be easy to find out where exactly the code messes the camera data up.



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/06/2003 at 13:49, xxxxxxxx wrote:

    Humor a beginner...
    How does one do a debug session for Cinema? I tried doing it, but couldn't get anywhere. I tried setting break points and running a debug session from Visual C++. Can you give me a simple step by step on how to set it up? Thanks.
     
    Matt



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/06/2003 at 14:03, xxxxxxxx wrote:

    no prob. Set Breakpoints with F9 and start the debugging with F5. You should switch to Debug version in Build->Set Active Configuration... (remember that you will have to specify the Cinema 4D executable in the settings for the Debug version).
    When debugging you can go through your code with F10 or get on with F5.
    Hope that helps...



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/06/2003 at 15:39, xxxxxxxx wrote:

    ok, I got the debugger working. It didn't work that smoothly in Windows 2000 at work... anyway...
    What I found was when I set the configuration to Debug, the plugin works, but crashes at the end. If I set the configuration to Release, the plugin doesn't crash, but also doesn't work correctly. Needless to say, since I was in the debug confiruration to debug it, everything worked fine except for a crash at the end (minor problem...) Any idea why the plugin work do this? I checked the configurations and it seems the only difference is the addition of the debug settings.
    Matt



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/06/2003 at 15:48, xxxxxxxx wrote:

    Hmm, sorry, without the code I cannot say anything. It might be a memory problem (had such "end-crashes" only if there was a memory problem). You might want to send the code to sdk_support@maxon.net with a detailed description of the problem. (you should narrow the problematic code area down to a minimum). Maybe Mikael can have a look and find the problem. This "usually" happens within 5 business days...
    But maybe Mikael will answer here already a possible solution...
    Did you find the problematic area while debugging?


Log in to reply