hello, i am trying to create a 3d box from on screen. (from a specified modelview)

here is what i do:

get from modelview 3 vectors (front, right and up) (they're versors)

then i check when i clicked at the beggining and i make a vertex (the first box vertex) call it A (red dot)

after that i check where actually mouse pos is and create a second vertex (the last box front face vertex) call it B (green dot)

i make a vector from first vertex to last vertex (AB)

and then project it onto 2 versors (right and up)

then i make a depth vector (from front versor)

but i does not work : )

here is a vid:

I am using the formula from wikipedia

result = lengthof(projected_vec) * cosine_between_those_2_vectors * versor_direction_of_vec_that_will_be projected_on

please look at my code it looks fine but maybe i can't find bug there

and here is code with (stage 2 - green dot and rest of box creation)

void __fastcall TModelGroupHandler::ResizeBox(int X, int Y, HWND hwnd) { if (n2ddistance(float(lastx), float(lasty), float(X), float(Y) ) < 10.0f) return; if (insert_box_first_stage_completed == false) return; double * m_PickInfo_ModelView = new double[16]; t3dpoint vX; t3dpoint vY; glGetDoublev(GL_MODELVIEW_MATRIX, m_PickInfo_ModelView); /* AIR_MATRIX[0] = rr.x; //right AIR_MATRIX[1] = rr.y; AIR_MATRIX[2] = rr.z; AIR_MATRIX[3] = 0.0f; AIR_MATRIX[4] = ru.x; //up AIR_MATRIX[5] = ru.y; AIR_MATRIX[6] = ru.z; AIR_MATRIX[7] = 0.0f; AIR_MATRIX[8] = -rf.x; //front AIR_MATRIX[9] = -rf.y; AIR_MATRIX[10] = -rf.z; AIR_MATRIX[11] = 0.0f; AIR_MATRIX[12] = 0.0f; //point AIR_MATRIX[13] = 0.0f; AIR_MATRIX[14] = 0.0f; AIR_MATRIX[15] = 1.0f; */ vX.x = float(m_PickInfo_ModelView[0]); vX.y = float(m_PickInfo_ModelView[1]); vX.z = float(m_PickInfo_ModelView[2]); vY.x = float(m_PickInfo_ModelView[4]); vY.y = float(m_PickInfo_ModelView[5]); vY.z = float(m_PickInfo_ModelView[6]); //vector projection onto another vector t3dpoint nX = vX; t3dpoint nY = vY; vX = vector_multiple(vX, 10000.0f); vY = vector_multiple(vY, 10000.0f); delete m_PickInfo_ModelView; t3dpoint res; t3dpoint res2; res = GetPositionFromSpaceDepth(X, Y, hwnd); //GREEN DOT //================================================================================== //right vector projection t3dpoint projected_vec; projected_vec = vectorAB(base->p1, res); float cos_angle = RadToDeg( AngleBetweenVectors(vX,projected_vec) ); //ssh cos_angle = cos(cos_angle*imopi); //ssh float magni; magni = magnitude( projected_vec ); float fp; /* floating point */ fp = magni * cos_angle; t3dpoint proper_right_vec = vector_multiple(nX, fp); //================================================================================== //down vector projection //================================================================================== projected_vec = vectorAB(base->p1, res); cos_angle = RadToDeg( AngleBetweenVectors(vY,projected_vec) ); //vY should be reversed now but i does not matter now because box right vector is wrong too) cos_angle = cos(cos_angle*imopi); //ssh fp = magni * cos_angle; t3dpoint proper_down_vec = vector_multiple(vY, fp); proper_down_vec = reverse_point( proper_down_vec ); //================================================================================== t3dpoint depth_v = vectorAB(base->eyepos, base->eyepointingpos); depth_v = Normalize( depth_v ); depth_v = vector_multiple(depth_v, 50.0f); //default 50 meters depth //************************************************* //** proper_down_vec //** proper_right_vec //** depth_v //** //** p1 p2 p5 p6 //** //** front back //** p4 p3 p8 p7 //** //** //** //************************************************* base->p5 = vectors_add(base->p1, depth_v); base->p3 = res; base->p7 = vectors_add(base->p3, depth_v); base->p2 = vectors_add(base->p1, proper_right_vec); base->p6 = vectors_add(base->p2, depth_v); base->p4 = vectors_add(base->p1, proper_down_vec); base->p8 = vectors_add(base->p4, depth_v); box_can_be_drawn = true; }

cheers

**Edited by ___, 23 March 2013 - 07:17 PM.**