WPF를 사용하여 3D로 점을 그려야합니다. ScreenSpaceLines3D 클래스를 사용하여 3D로 선을 그리지 만 3D로 점을 그릴 수 없습니다 (모델 확대/축소). 아무도 나를 도울 수 있습니까? 일부 예제 코드는 높이 평가 될 것입니다. 감사합니다WPF 3D 점 그림
0
A
답변
0
표면적이 없기 때문에 지점을 볼 수 없습니다. WPF 3d는 불행히도 광선 추적 엔진이 아닙니다.
그러나 누군가 멋진 레이 트레이싱 스타터 라이브러리를 만들었습니다. 이 프로젝트는 WPF로 광선 추적을 수행하려는 경우 좋은 출발점입니다 : http://raytracer.codeplex.com/.
0
너무 복잡한 작업이 아닙니다.
다운로드 Helix3D 도서관
은 실현 확대에 scphere의 반경을 연결 샘플에서 구 메쉬 코드
를 찾을 수 있습니다. 당신은 색상, 크기
viewport
에 포인트를 추가 할 수 있습니다 함께helixtoolkit
에서
1
사용 PointsVisual3D
클래스. 변환을 적용 할 수도 있습니다.
0
나는 PointVisual3d 소유 클래스를 만들 수 있습니다. PointVisual3D의 코드는이 코드가 도움이된다고 생각합니다.
public class PointVisual3D:ModelVisual3D
{
private readonly GeometryModel3D _model;
private readonly MeshGeometry3D _mesh;
private Matrix3D _visualToScreen;
private Matrix3D _screenToVisual;
public PointVisual3D()
{
_mesh = new MeshGeometry3D();
_model = new GeometryModel3D();
_model.Geometry = _mesh;
SetColor(this.Color);
this.Content = _model;
this.Points = new Point3DCollection();
CompositionTarget.Rendering += OnRender;
}
private void OnRender(object sender, EventArgs e)
{
if (Points.Count == 0 && _mesh.Positions.Count == 0)
{
return;
}
if (UpdateTransforms() && MainWindow.mousedown==false)
{
RebuildGeometry();
}
}
public static readonly DependencyProperty ColorProperty = DependencyProperty.Register("Color", typeof(Color), typeof(PointVisual3D), new PropertyMetadata(Colors.White, OnColorChanged));
private static void OnColorChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
((PointVisual3D)sender).SetColor((Color)args.NewValue);
}
private void SetColor(Color color)
{
MaterialGroup unlitMaterial = new MaterialGroup();
unlitMaterial.Children.Add(new DiffuseMaterial(new SolidColorBrush(Colors.Black)));
unlitMaterial.Children.Add(new EmissiveMaterial(new SolidColorBrush(color)));
unlitMaterial.Freeze();
_model.Material = unlitMaterial;
_model.BackMaterial = unlitMaterial;
}
public Color Color
{
get { return (Color)GetValue(ColorProperty); }
set { SetValue(ColorProperty, value); }
}
//public static readonly DependencyProperty ThicknessProperty = DependencyProperty.Register("Thickness", typeof(double), typeof(PointVisual3D), new PropertyMetadata(1.0, OnThicknessChanged));
//private static void OnThicknessChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
//{
// ((PointVisual3D)sender).GeometryDirty();
//}
//public double Thickness
//{
// get { return (double)GetValue(ThicknessProperty); }
// set { SetValue(ThicknessProperty, value); }
//}
public static readonly DependencyProperty PointsProperty = DependencyProperty.Register("Points", typeof(Point3DCollection), typeof(PointVisual3D), new PropertyMetadata(null, OnPointsChanged));
private static void OnPointsChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
((PointVisual3D)sender).GeometryDirty();
}
public Point3DCollection Points
{
get { return (Point3DCollection)GetValue(PointsProperty); }
set { SetValue(PointsProperty, value); }
}
private void GeometryDirty()
{
_visualToScreen = MathUtils.ZeroMatrix;
}
private void RebuildGeometry()
{
//double halfThickness = Thickness/2.0;
//int numLines = Points.Count/2;
//Point3DCollection positions = new Point3DCollection(numLines * 4);
//for (int i = 0; i < numLines; i++)
//{
// int startIndex = i * 2;
// Point3D startPoint = Points[startIndex];
// Point3D endPoint = Points[startIndex + 1];
// AddSegment(positions, startPoint, endPoint, halfThickness);
//}
//positions.Freeze();
//_mesh.Positions = positions;
Int32Collection indices = new Int32Collection(Points.Count * 6);
for (int i = 0; i < Points.Count; i++)
{
indices.Add(i * 4 + 2);
indices.Add(i * 4 + 1);
indices.Add(i * 4 + 0);
indices.Add(i * 4 + 2);
indices.Add(i * 4 + 3);
indices.Add(i * 4 + 1);
}
indices.Freeze();
_mesh.TriangleIndices = indices;
_mesh.Positions = CreatePositions(this.Points, this.Size, 0.0);
}
public Point3DCollection CreatePositions(IList<Point3D> points, double size = 1.0, double depthOffset = 0.0)
{
double halfSize = size/2.0;
int numPoints = points.Count;
var outline = new[]
{
new Vector(-halfSize, halfSize), new Vector(-halfSize, -halfSize), new Vector(halfSize, halfSize),
new Vector(halfSize, -halfSize)
};
var positions = new Point3DCollection(numPoints * 4);
for (int i = 0; i < numPoints; i++)
{
var screenPoint = (Point4D)points[i] * this._visualToScreen;
double spx = screenPoint.X;
double spy = screenPoint.Y;
double spz = screenPoint.Z;
double spw = screenPoint.W;
if (!depthOffset.Equals(0))
{
spz -= depthOffset * spw;
}
var p0 = new Point4D(spx, spy, spz, spw) * this._screenToVisual;
double pwinverse = 1/p0.W;
foreach (var v in outline)
{
var p = new Point4D(spx + v.X * spw, spy + v.Y * spw, spz, spw) * this._screenToVisual;
positions.Add(new Point3D(p.X * pwinverse, p.Y * pwinverse, p.Z * pwinverse));
}
}
positions.Freeze();
return positions;
}
/// <summary>
/// Identifies the <see cref="Size"/> dependency property.
/// </summary>
public static readonly DependencyProperty SizeProperty = DependencyProperty.Register(
"Size", typeof(double), typeof(PointVisual3D), new UIPropertyMetadata(1.0, GeometryChanged));
protected static void GeometryChanged(object sender, DependencyPropertyChangedEventArgs e)
{
((PointVisual3D)sender).GeometryDirty();
}
public double Size
{
get
{
return (double)this.GetValue(SizeProperty);
}
set
{
this.SetValue(SizeProperty, value);
}
}
//private void AddSegment(Point3DCollection positions, Point3D startPoint, Point3D endPoint, double halfThickness)
//{
// Vector3D lineDirection = endPoint * _visualToScreen - startPoint * _visualToScreen;
// lineDirection.Z = 0;
// lineDirection.Normalize();
// Vector delta = new Vector(-lineDirection.Y, lineDirection.X);
// delta *= halfThickness;
// Point3D pOut1, pOut2;
// Widen(startPoint, delta, out pOut1, out pOut2);
// positions.Add(pOut1);
// positions.Add(pOut2);
// Widen(endPoint, delta, out pOut1, out pOut2);
// positions.Add(pOut1);
// positions.Add(pOut2);
//}
//private void Widen(Point3D pIn, Vector delta, out Point3D pOut1, out Point3D pOut2)
//{
// Point4D pIn4 = (Point4D)pIn;
// Point4D pOut41 = pIn4 * _visualToScreen;
// Point4D pOut42 = pOut41;
// pOut41.X += delta.X * pOut41.W;
// pOut41.Y += delta.Y * pOut41.W;
// pOut42.X -= delta.X * pOut42.W;
// pOut42.Y -= delta.Y * pOut42.W;
// pOut41 *= _screenToVisual;
// pOut42 *= _screenToVisual;
// pOut1 = new Point3D(pOut41.X/pOut41.W, pOut41.Y/pOut41.W, pOut41.Z/pOut41.W);
// pOut2 = new Point3D(pOut42.X/pOut42.W, pOut42.Y/pOut42.W, pOut42.Z/pOut42.W);
//}
private bool UpdateTransforms()
{
Viewport3DVisual viewport;
bool success;
Matrix3D visualToScreen = MathUtils.TryTransformTo2DAncestor(this, out viewport, out success);
if (!success || !visualToScreen.HasInverse)
{
_mesh.Positions = null;
return false;
}
if (visualToScreen == _visualToScreen)
{
return false;
}
_visualToScreen = _screenToVisual = visualToScreen;
_screenToVisual.Invert();
return true;
}
}
관련 문제
- 1. 생성하는 3D CAPTCHA [그림]
- 2. Disparity에서 3D 점 생성
- 3. 두 세트의 3d 점
- 4. 3D 지형 점 계산
- 5. WPF 로그 차트 그림
- 6. wpf 이미지에서 그림 그리기
- 7. 2D XY 평면에 3D 점 투영
- 8. Python의 3D 모델 (점/선) 렌더러
- 9. 주어진 3D 점 배열을 통과하는 파이프를 그립니다.
- 10. wpf 3D 애니메이션
- 11. 뷰포트 3D WPF C#
- 12. WPF ListBox의 항목으로 3d 요소
- 13. WPF : 둥근 모서리가있는 3D 큐브
- 14. WPF 3D ImageBrush와 소재에 도움
- 15. WPF 3D 삼각형 오버랩 문제
- 16. 알파 채널이있는 WPF 3D 텍스처
- 17. 3D : 삼각형 3D 공간에서
- 18. WPF 및 3D 3D 공간에서 단일 위치 점을 어떻게 변경합니까?
- 19. WPF, C#, TaskbarItemInfo : 축소판 그림 창 숨기기?
- 20. WPF : 경로의 단일 점 가져 오기?
- 21. WPF ToolBar : 그립을 제거하는 방법 (왼쪽의 점)
- 22. 원치 않는 겹치는 표면을 다루는 3D 점 구름으로부터의 표면 재구성?
- 23. 최소 거리 합계를 사용하여 3D 점 집합을 다른 집합에 매핑
- 24. 3D 점 구름을 사용하여 바닥 평면의 각도를 오프셋합니다. v 정상 및 바닥 점
- 25. 3D 모델과 함께 딥 확대/축소 WPF
- 26. 히트 테스트 WPF 3D 모델 부품
- 27. 3D WPF 오브젝트의 중심을 변경하는 방법
- 28. 프로그래밍 방식으로 WPF 3D 큐브 만들기
- 29. WPF - 3d 끌어서 놓기 디자인 도구에서 가능합니까?
- 30. 애니메이션에 대한 WPF 및 3D 질문