void MannequinMoveManipulator::recalcMetrics() { MPoint translate; getPointValue(_translateIndex, false, translate); MMatrix childMatrix = _childXform.asMatrix(); _x = (MVector::xAxis * childMatrix).normal(); _y = (MVector::yAxis * childMatrix).normal(); _z = (MVector::zAxis * childMatrix).normal(); _origin = translate * _parentXform.asMatrix(); }
/** * Funktion zum verteilten berechnen der 2D-Temperaturverteilung. * @param status_flag Zeiger auf Variable, die enthält ob der Thread beendet ist. (0 = Beendet) * @param value_img Liste für die Daten der Temperaturverteilung. * @param image Grafik für die Temperaturverteilung. * @param width Breite der Temperaturverteilungsgrafik. * @param height Höhe der Temperaturverteilungsgrafik. * @param startheight Starthöhe für diesen Thread in der Grafik. * @param delta_h Höhe des von diesem Thread zu berechnenden Streifens. * @param info Informationen über die Eigenschaften der zu berechnenden Ebene. * @param xvec X-Achse der Ebene. * @param yvec Y-Achse der Ebene. * @param v0 Mittelpunkt der Ebene. * @param bases Möglichst einfache Geometrien Geometrien der Materialien. * @param obj Das aktuelle Objekt. * @param sensor_data Die zu verwendenden Sensordaten. * @param use_last_tet Versuchen, die Interpolation durch vorgezogenes Testen des zuletzt verwendeten Tetraeders zu beschleunigen. * Diese Option ist verursacht Ungenauigkeiten und bietet zumeist wenig Performancegewinn. */ void render_thread(bool* status_flag, float* value_img, wxImage* image, int width, int height, int startheight, int delta_h, CutRender_info* info, Vector3D* xvec, Vector3D* yvec, Vector3D* v0, vector<tetgenio*>* bases, ObjectData* obj, vector<SensorPoint>* sensor_data, bool use_last_tet) { Interpolator interpolator; //Referenz auf den letzten für die Interpolation gewählten Tetraeder vector<SensorPoint*>* last_tet = new vector<SensorPoint*>; //Referenz auf den aktuell für die Interpolation gewählten Tetraeder vector<SensorPoint*>* new_tet = new vector<SensorPoint*>; //Die Visualisierungsinformationen Visualization_info* vis_info = wxGetApp().getVisualizationInfo(); //Wurde der zuletzt verwendete Tetraeder initialisiert? bool last_tet_init = false; //Für alle Pixel im zu berechnenden Streifen... for (int x = 0; x < width; x++) { for (int y = startheight; y < startheight + delta_h; y++) { //Position des Pixels im 3D-Raum Vector3D* p = v0->copy(); //Verschiebung auf der X-Achse der Ebene im vergleich zum Ebenenmittelpunkt Vector3D* part_x = xvec->copy(); part_x->mult( x * info->mmperpixel / 1000. - width * info->mmperpixel / 2000); //Verschiebung auf der Y-Achse der Ebene im vergleich zum Ebenenmittelpunkt Vector3D* part_y = yvec->copy(); part_y->mult( y * info->mmperpixel / 1000. - height * info->mmperpixel / 2000); //Berechnen der Position des Pixels im 3D-Raum p->add(part_x); p->add(part_y); delete part_x; delete part_y; //Initialisieren des Pixels image->SetAlpha(x, y, 0); image->SetRGB(x, y, 0, 0, 0); value_img[y * width + x] = -300; //Für alle Materialien des objekts... for (unsigned int m = 0; m < obj->getMaterials()->size(); m++) { //Das aktuelle Material ObjectData::MaterialData* mat = &obj->getMaterials()->at(m); //Befindet sich der Punkt im aktuellen Material? if (pointInsideMesh(p, bases->at(m), info->in_volume_algorithm)) { //Ermitteln des Wertes für den Punkt int status = 0; interpolator.setMode(mat->interpolation_mode); float value = (float) getPointValue(status, sensor_data, p->getXYZ(), &interpolator, (last_tet_init && use_last_tet) ? last_tet : NULL, use_last_tet ? new_tet : 0); //Tausch der Speicherorte des Tetraeders, in dem sich der Punkt in diesem und im vorherigen Durchlauf befand vector<SensorPoint*>* temp; temp = last_tet; last_tet = new_tet; new_tet = temp; last_tet_init = true; //Speichern des Wertes in der Temperaturverteilung value_img[y * width + x] = value; //Berechnen der Farbe zum Temperaturwert float inverse_hue = (value - vis_info->min_visualisation_temp) / (vis_info->max_visualisation_temp + vis_info->min_visualisation_temp); float* color = hsvToRgb( (1.0 - clampHue(inverse_hue)) * .666, 1, 1); //Speichern des Wertes in der Grafik image->SetRGB(x, y, (unsigned char) (color[0] * 255), (unsigned char) (color[1] * 255), (unsigned char) (color[2] * 255)); delete color; image->SetAlpha(x, y, 255); break; } } delete p; } } delete new_tet; delete last_tet; //markieren des Threads als beendet *status_flag = 0; }
MStatus MannequinMoveManipulator::doPress(M3dView& view) { getPointValue(_translateIndex, false, _opValueBegin); GLuint activeAxis; glActiveName(activeAxis); if (activeAxis == _glPickableItem + 0) { _opAxis = _x; _opAxisIndex = 0; } else if (activeAxis == _glPickableItem + 1) { _opAxis = _y; _opAxisIndex = 1; } else if (activeAxis == _glPickableItem + 2) { _opAxis = _z; _opAxisIndex = 2; } else { _opAxis = MVector::zero; _opValid = false; return MS::kUnknownParameter; } _opOrigin = _origin; // Determine the translation "plane"; it is orthogonal to the axis and faces // the view as best as possible. short originX, originY; view.worldToView(_opOrigin, originX, originY); MPoint rayNear; MVector dirToOrigin; view.viewToWorld(originX, originY, rayNear, dirToOrigin); MVector dirInPlane = dirToOrigin ^ _opAxis; _opPlaneNormal = dirInPlane ^ _opAxis; // Determine where the current mouse ray hits the plane. MPoint rayOrigin; MVector rayDirection; mouseRayWorld(rayOrigin, rayDirection); MPoint isect; bool didIsect = Util::rayPlaneIntersection(rayOrigin, rayDirection, _opOrigin, _opPlaneNormal, &isect); if (!didIsect) { _opValid = false; return MS::kUnknownParameter; } _opHitBegin = isect; _opValid = true; // We need to calculate the handle directions in parent space. This is // because the handle positions align with the child pivot rotation, so they // DO NOT correspond to the child's X, Y, and Z-position, which are // indicated in terms of the parent's coordinate space. MMatrix parentInverse = _parentXform.asMatrixInverse(); _xInParentSpace = _x * parentInverse; _yInParentSpace = _y * parentInverse; _zInParentSpace = _z * parentInverse; return MS::kSuccess; }