Beispiel #1
0
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;
}
Beispiel #3
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;
}